You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions中Windows平台CMake构建Eigen失败求助

问题: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的默认数学库链接规则。

修复步骤:

  1. 彻底隔离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})
    
  2. 移除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 }}
    
  3. 指定Eigen兼容的C++标准(可选)
    如果OpenXLSX强制使用C++17及以上标准,可在拉取Eigen时明确指定兼容版本:

    set(EIGEN_CXX_STANDARD 11) # 或匹配项目实际使用的标准
    

原理说明

Eigen的CMake检测逻辑依赖编译器默认配置,当OpenXLSX修改了CMAKE_CXX_STANDARD或添加特殊编译选项后,Eigen的CPP版本检测、数学库链接检测都会失效。通过隔离Eigen的配置环境,确保它在干净的编译器设置下完成检测,即可解决问题。

内容的提问来源于stack exchange,提问作者skrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:27:11