使用CMake编译Eigen3遇问题(MSVC与Clang环境)
解决Windows下编译Eigen3 3.4.0的两个问题
问题1:MSVC 2022提示不支持C++11
原因分析
Eigen 3.4.0的CMake检测脚本对MSVC的__cplusplus宏处理存在兼容问题,MSVC默认不会正确定义符合标准的__cplusplus值,导致检测逻辑误判。而仅头文件使用时无需通过CMake预检测,因此编译可正常进行。
解决步骤
- 配置CMake时手动指定C++标准并强制开启:
cmake -G "Visual Studio 17 2022" -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_STANDARD_REQUIRED=ON .. - 添加MSVC的
__cplusplus标准定义编译选项,让检测脚本识别正确的C++版本:cmake -G "Visual Studio 17 2022" -DCMAKE_CXX_FLAGS="/Zc:__cplusplus" .. - 若上述方法无效,可直接跳过检测,强制设置检测变量为ON:
cmake -G "Visual Studio 17 2022" -DEIGEN_COMPILER_SUPPORT_CPP11=ON ..
问题2:Ninja+Clang提示无法链接标准数学库
原因分析
Windows下Clang需要依赖MSVC的标准库和链接器环境,Eigen的CMake检测脚本在这种组合下可能无法正确定位或链接数学库,即便Clang本身能正常编译含cmath的程序。
解决步骤
- 在MSVC开发者命令提示符中运行CMake,确保Clang能获取完整的编译环境:
- 打开
Developer Command Prompt for VS 2022 - 切换到Eigen源码目录的build文件夹
- 执行配置命令:
cmake -G Ninja -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang ..
- 打开
- 指定正确的标准库和运行时库,确保链接到系统数学库:
cmake -G Ninja -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded$<$<CONFIG:Debug>:Debug> .. - 强制跳过数学库链接检测,手动设置变量开启cmath支持:
cmake -G Ninja -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DEIGEN_HAS_CMATH=ON ..
内容的提问来源于stack exchange,提问作者Reza Masoumi
相关产品推荐
相关产品推荐

