GitHub Actions中Windows平台CMake构建Eigen失败求助
项目背景
我正在开发一个使用Eigen线性代数库的C++项目,根目录CMakeLists.txt中拉取Eigen的代码如下:
message([STATUS] "Fetching eigen.") block(SCOPE_FOR VARIABLES) set(EIGEN_BUILD_TESTING OFF) set(EIGEN_BUILD_PKGCONFIG OFF) set(EIGEN_BUILD_DOC OFF) FetchContent_Declare( Eigen GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git GIT_TAG 3.4 GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) FetchContent_MakeAvailable(Eigen) endblock()
我配置了GitHub Actions分别在ubuntu-22.04和windows-latest平台构建测试,Windows平台的构建指令(截取配置阶段)如下:
# This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage. name: CMake build and test on Windows on: push: branches: [ "master" ] pull_request: branches: [ "master" ] env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release jobs: build: name: build and test runs-on: windows-latest steps: - uses: actions/checkout@v4 - name: Set reusable strings id: strings shell: bash run: | echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" echo "bin-output-dir=${{ github.workspace }}/bin" >> "$GITHUB_OUTPUT" - name: Configure CMake run: > cmake -B ${{ steps.strings.outputs.build-output-dir }} -DCMAKE_CXX_COMPILER=msvc -DCMAKE_C_COMPILER=msvc -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} -S ${{ github.workspace }}
错误信息
Linux平台构建成功,但Windows平台在"Configure CMake"阶段失败,错误日志如下:
[STATUS]Fetching pugixml. [STATUS]Fetching eigen. -- The C compiler identification is MSVC 19.39.33523.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/cl.exe - skipped -- Detecting C compile features -- Detecting C compile features - done -- Performing Test EIGEN_COMPILER_SUPPORT_CPP11 -- Performing Test EIGEN_COMPILER_SUPPORT_CPP11 - Failed -- Performing Test COMPILER_SUPPORT_std=cpp03 -- Performing Test COMPILER_SUPPORT_std=cpp03 - Failed -- Performing Test standard_math_library_linked_to_automatically -- Performing Test standard_math_library_linked_to_automatically - Failed -- Performing Test standard_math_library_linked_to_as_m -- Performing Test standard_math_library_linked_to_as_m - Failed CMake Error at build/_deps/eigen-src/CMakeLists.txt:136 (message): Can't link to the standard math library. Please report to the Eigen developers, telling them about your platform. -- Configuring incomplete, errors occurred! Error: Process completed with exit code 1.
补充说明
添加OpenXLSX作为子模块之前,项目可以正常编译;Eigen官方明确说明支持MSVC编译器。
问题核心是OpenXLSX子模块修改了全局CMake配置,干扰了Eigen的环境检测逻辑。具体来说,OpenXLSX可能强制设置了特定的C++标准或编译选项,导致Eigen无法正确识别MSVC的默认数学库链接规则。
修复步骤:
彻底隔离Eigen的CMake配置环境
当前使用的block(SCOPE_FOR VARIABLES)无法完全隔离所有全局变量,建议改用保存-恢复全局设置的方式:message([STATUS] "Fetching eigen.") # 保存当前C++标准相关设置 set(OLD_CXX_STANDARD ${CMAKE_CXX_STANDARD}) set(OLD_CXX_STANDARD_REQUIRED ${CMAKE_CXX_STANDARD_REQUIRED}) # 临时清空相关设置,让Eigen自行检测 unset(CMAKE_CXX_STANDARD) unset(CMAKE_CXX_STANDARD_REQUIRED) set(EIGEN_BUILD_TESTING OFF) set(EIGEN_BUILD_PKGCONFIG OFF) set(EIGEN_BUILD_DOC OFF) FetchContent_Declare( Eigen GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git GIT_TAG 3.4.1 # 升级到最新补丁版本 GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) FetchContent_MakeAvailable(Eigen) # 恢复原有C++标准设置 set(CMAKE_CXX_STANDARD ${OLD_CXX_STANDARD}) set(CMAKE_CXX_STANDARD_REQUIRED ${OLD_CXX_STANDARD_REQUIRED})移除GitHub Actions中多余的编译器指定
Windows平台的GitHub Actions环境会自动检测MSVC,无需手动指定-DCMAKE_CXX_COMPILER=msvc,移除该参数避免干扰:- name: Configure CMake run: > cmake -B ${{ steps.strings.outputs.build-output-dir }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} -S ${{ github.workspace }}指定Eigen兼容的C++标准(可选)
如果OpenXLSX强制使用C++17及以上标准,可在拉取Eigen时明确指定兼容版本:set(EIGEN_CXX_STANDARD 11) # 或匹配项目实际使用的标准
原理说明
Eigen的CMake检测逻辑依赖编译器默认配置,当OpenXLSX修改了CMAKE_CXX_STANDARD或添加特殊编译选项后,Eigen的CPP版本检测、数学库链接检测都会失效。通过隔离Eigen的配置环境,确保它在干净的编译器设置下完成检测,即可解决问题。
内容的提问来源于stack exchange,提问作者skrat

