在win7上面编译Sigar,由于开发环境及编译器版本不同,出现了许多问题。
开发环境:
win7, CMAKE 3.11.0-rc2, jdk 1.8, perl5, ant 1.10.1, vs2015
1. 编译之前要运行 %vs_root%\VC\vcvarsall.bat amd64,设置vs的编译依赖环境, 64位的windows一定要加上参数 amd64
2. vs2015需要根据https://github.com/hyperic/sigar/issues/111的建议修改源码,解决snprintf宏定义冲突问题
diff --git a/src/os/win32/sigar_os.h b/src/os/win32/sigar_os.h index 1499236..231f8ae 100755 --- a/src/os/win32/sigar_os.h +++ b/src/os/win32/sigar_os.h @@ -25,7 +25,9 @@ #ifdef MSVC #define WIN32_LEAN_AND_MEAN +#if _MSC_VER < 1900 #define snprintf _snprintf +#endif #if _MSC_VER <= 1200 #define SIGAR_USING_MSC6 /* Visual Studio version 6 */ #define HAVE_MIB_IPADDRROW_WTYPE 0
3. vs2015需要根据https://github.com/hyperic/sigar/issues/112的建议修改源码,解决wcstok函数签名不一致问题,也可以使用 _wcstok代替原来的wcstok,以调用老版函数。
--- a/bindings/java/src/jni/win32/eventlog.c 2010-04-28 17:00:00.000000000 -0400 +++ b/bindings/java/src/jni/win32/eventlog.c 2018-01-23 15:55:39.605908161 -0500 @@ -130,7 +130,8 @@ } } - ptr = wcstok(msgdll, FILESEP); + LPWSTR ex; + ptr = wcstok(msgdll, FILESEP, &ex); while (ptr) { HINSTANCE hlib; @@ -150,7 +151,7 @@ break; } } - ptr = wcstok(NULL, FILESEP); + ptr = wcstok(NULL, FILESEP, &ex); } if (msgbuf) {
这样在bindings/java目录下面执行
ant clean
ant
就可以编译成功。