Windows下用MSVC2015编译Shogun 6.1.3失败:Eigen包含pthread.h问题
问题重现
我最近在Windows 10(版本10.0.16299)上尝试用MSVC 2015和CMake编译Shogun 6.1.3,结果卡在了Eigen尝试包含pthread.h的错误上。CMake生成的配置日志片段如下:
选择Windows SDK版本10.0.15063.0以适配Windows 10.0.16299;
使用系统malloc;
未找到GDB(缺失:GDB_COMMAND GDB_VERSION);
dir='C:/Users/myUser/Desktop/shogun/src';
dir='C:/Users/myUser/Desktop/shogun/build/src';
dir='C:/Users/myUser/Desktop/shogun/src/gpl';
未找到CxaDemangle(缺失:HAVE_CXA_DEMANGLE);
未找到CxaDemangle(missi...
问题根源
pthread.h是POSIX线程库的头文件,Windows系统根本没有原生支持这个库。Eigen在默认配置下会尝试启用线程支持,而Shogun 6.1.3自带的Eigen版本在MSVC 2015环境下没有正确判断Windows平台的线程实现,导致硬引入了pthread.h,直接触发编译错误。另外MSVC 2015对C++标准的支持相对老旧,也可能加剧了兼容性问题。
可行的解决方案
1. 强制Eigen禁用线程支持
这是最直接的解决办法,通过CMake添加编译宏,告诉Eigen不要使用任何线程库:
# 在CMakeLists.txt中添加 add_definitions(-DEIGEN_DONT_USE_THREADS) # 或者直接修改CXX_FLAGS set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_DONT_USE_THREADS")
如果你用的是CMake GUI,直接在CMAKE_CXX_FLAGS输入框里追加-DEIGEN_DONT_USE_THREADS即可。
2. 替换Shogun自带的Eigen版本
Shogun 6.1.3捆绑的Eigen版本可能存在Windows适配问题,你可以换成最新的稳定版Eigen(比如3.4.0):
- 下载Eigen源码包,解压到本地文件夹
- 在CMake配置界面,找到
EIGEN_INCLUDE_DIR选项,手动指向你下载的Eigen头文件目录,覆盖Shogun自带的版本
3. 调整Shogun的编译选项
在CMake配置中关闭依赖线程的功能:
- 找到
SHOGUN_PARALLEL选项,设置为OFF - 确保
SHOGUN_USE_EIGEN_THREADS被禁用(如果这个选项存在的话)
4. 适配MSVC 2015的C++标准
MSVC 2015对C++11的支持需要明确指定,在CMake中添加:
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)
这能避免因C++标准不兼容导致的其他潜在问题。
验证步骤
- 彻底删除之前的build目录,避免旧配置干扰
- 重新运行CMake配置,检查日志里是否不再出现pthread相关的错误提示
- 启动编译,确认整个过程能正常完成
内容的提问来源于stack exchange,提问作者paperox

