windows下 jemalloc編譯


1、准備

Windows下使用VS2015進行編譯,需要使用cmake構建版本。(如果有cygwin,在其中執行VS的vcvarsall.bat后使用"CC=cl ./autogen.sh"命令生成Makefile后編譯也是可以的)
下載源碼

git clone https://github.com/jemalloc/jemalloc-cmake.git

請確保已經安裝好cmake工具。

還可以下載一個專門為win32修改的版本,支持VC6編譯。

git clone https://github.com/BlzFans/jemalloc_win32.git

2、編譯

分別使用VS2015和mingw編譯。

VS2015編譯jemalloc

方式一
直接使用VS2015打開源碼目錄下的msvc目錄下的jemalloc_vc2015,然后進行編譯即可。
使用這種方式編譯的時候有很多問題。首先是VS2015不支持C11的atomic,沒有stdatomic.h頭文件,這需要注釋掉JEMALLOC_C11ATOMICS這個宏定義。然后是大量__builtin_xxxxx函數未定義,這個可以使用自己實現的。

方式二
打開VS2015 x64本機工具命令提示符(VS2015 x64 Native Tools Command Prompt)。
進入源碼目錄,創建一個目錄build,進入build目錄后執行下面命令。

Z:\jemalloc\jemalloc-cmake\build>cmake -G"Visual Studio 14 Win64" -DCMAKE_INSTALL_PREFIX=Z:\vs140-64 ..

因為jemalloc的CMakeLists.txt文件中實際上沒有寫install部分(被注釋掉),所以指定安裝目錄是無效的。
還可以直接執行CMake_configure.cmd來生成VS工程。

如果沒有問題,將在build目錄下生成VS工程文件。
執行下面命令進行編譯(這里將只編譯Release版本)

Z:\jemalloc\jemalloc-cmake\build>msbuild /p:configuration=Release /maxcpucount:8 ALL_BUILD.vcxproj

生成的目標文件在build/Release目錄下。

也可以使用CygWin來生成Makefile文件,相關介紹在ReadMe.txt文件中有寫。

MinGW下編譯jemalloc

打開mingw命令行工具(或者msys2/cygwin等)進入源碼目錄,新建目錄build-mingw並進入。
運行下面命令生成Makefile文件

cmake -G"MSYS Makefiles" -DCMAKE_SYSTEM_NAME=Windows ..

生成過程中遇到以下錯誤
錯誤1

-- CMAKE_C_COMPILER_ID: GNU
CMake Error at Utilities.cmake:778 (CHECK_C_COMPILER_FLAG):
  Unknown CMake command "CHECK_C_COMPILER_FLAG".
Call Stack (most recent call first):
  CMakeLists.txt:149 (JeCflagsAppend)


-- Configuring incomplete, errors occurred!
See also "F:/compile/jemalloc-cmake/build/CMakeFiles/CMakeOutput.log".

這個直接注釋掉Utilities.cmake778行即可。

錯誤2

CMake Error at Utilities.cmake:755 (message):
  GetSystemPageSize failed compilation see
  F:/compile/jemalloc-cmake/build/GetPageSize/getpagesize.log
Call Stack (most recent call first):
  CMakeLists.txt:464 (GetSystemPageSize)

這里可以查看CMakeLists.txt464行前后,發現是系統分頁大小沒有獲取到的原因,這里可以直接給它設置為4096(這個可以使用下面的代碼獲取)
GetPageSize.c

#include <windows.h>
#include <stdio.h>
int main(int argc, const char** argv) {
	int result;
#ifdef _WIN32
	SYSTEM_INFO si;
	GetSystemInfo(&si);
	result = si.dwPageSize;
#else
	result = sysconf(_SC_PAGESIZE);
#endif
	printf("%d", result);
	return 0;
}

使用下面命令重新生成

cmake -G"MSYS Makefiles" -DCMAKE_SYSTEM_NAME=Windows -DLG_PAGE=4096 ..

不知道是什么原因,LG_PAGE設置4096就會失敗(Please wait while we configure class sizes),設置為4沒有問題,不知道是不是單位的原因(Windows下分頁應該是4MB)

然后使用下面命令進行構建(必須指定C_FLAGS參數,因為生成的Makefile中使用的是VC編譯器的參數)

 make C_FLAGS="-D_WIN32 -DWIN32 -DWIN64 -O2"

編譯時出現如下錯誤
錯誤1

include/jemalloc/internal/spin.h:41:3: 錯誤:‘CPU_SPINWAIT’未聲明(在此函數內第一次使用)
   CPU_SPINWAIT;
   ^~~~~~~~~~~~

這個只需要修改include\jemalloc\internal\jemalloc_internal_defs.h文件的第23行。修改為

#define CPU_SPINWAIT _mm_pause()

更多類似的問題,可以通過拷貝cmake生成VS工程中的jemalloc_internal_defs.h覆蓋原文件來解決。

錯誤2

[  4%] Linking C shared library libjemallocso.dll
gcc: 錯誤:/FC:No such file or directory
gcc: 錯誤:/d2Zi+:No such file or directory
gcc: 錯誤:/Zi:No such file or directory
gcc: 錯誤:/FS:No such file or directory
gcc: 錯誤:/nologo:No such file or directory
gcc: 錯誤:/W3:No such file or directory
gcc: 錯誤:/WX:No such file or directory
gcc: 錯誤:/GS:No such file or directory
gcc: 錯誤:/Zc:wchar_t:No such file or directory
gcc: 錯誤:/Zc:forScope:No such file or directory
gcc: 錯誤:/errorReport:queue:No such file or directory
gcc: 錯誤:/wd4267:No such file or directory
gcc: 錯誤:/wd4244:No such file or directory
gcc: 錯誤:/wd4146:No such file or directory
gcc: 錯誤:/wd4334:No such file or directory
gcc: 錯誤:/wd4090:No such file or directory
make[2]: *** [CMakeFiles/jemallocso.dir/build.make:798:libjemallocso.dll] 錯誤 1
make[1]: *** [CMakeFiles/Makefile2:1510:CMakeFiles/jemallocso.dir/all] 錯誤 2
make: *** [Makefile:95:all] 錯誤 2

直接打開CMakeFiles/jemallocso.dir/build.make文件,定位到798行,將其中的/FC /d2Zi+等刪除即可。其他類似的問題都可以這樣解決。(包括chunk、xallocx、thread_tcache_enabled、overflow、mallocx等等,如果不想一個個解決,可以使用-k參數跳過這些工具的編譯。只需要jemallocso編譯出來了就可以用了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM