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.cmake
的778
行即可。
錯誤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.txt
的464
行前后,發現是系統分頁大小沒有獲取到的原因,這里可以直接給它設置為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編譯出來了就可以用了)