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

GitHub Actions无法启用C++23编译,求助问题排查

问题:GitHub Actions中C++23编译失败排查

我配置了如下Linux环境的GitHub Actions工作流文件:

name: Build & Test (Linux)

on:
  push:
    branches: [ "master", "develop" ]
  pull_request:
    branches: [ "master", "develop" ]

jobs:
  build:
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        build_type: [Release]
        c_compiler: [gcc, clang]
        include:
          - os: ubuntu-latest
            c_compiler: gcc
            cpp_compiler: g++
          - os: ubuntu-latest
            c_compiler: clang
            cpp_compiler: clang++

    steps:
    - uses: actions/checkout@v3

    - name: Set reusable strings
      id: strings
      shell: bash
      run: |
        echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"
    - name: Install Compilers
      run: >
        sudo apt update && sudo apt install gcc-13 && sudo apt-get install build-essential
    - name: Set Default Compilers
      run: >
        sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-13 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-13 --slave /usr/bin/gcov gcov /usr/bin/gcov-13
    - name: Check Compiler Versions
      run: >
        gcc -v && clang -v
    - name: Install Libraries
      run: >
        sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a
    - name: Configure CMake
      run: >
        cmake -B ${{ steps.strings.outputs.build-output-dir }}
        -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
        -DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
        -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
        -S ${{ github.workspace }}
    - name: Build
      run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}

    - name: Test
      working-directory: ${{ steps.strings.outputs.build-output-dir }}
      run: ${{ steps.strings.outputs.build-output-dir }}/test/dzik_tests

同时在CMakeLists.txt中设置了:

set(CMAKE_CXX_STANDARD 23)

但GitHub Actions编译始终失败:

GCC报错:

Run cmake --build /home/runner/work/dzik-vm/dzik-vm/build --config Release
[  5%] Building CXX object CMakeFiles/dzik.dir/src/main.cpp.o
[ 11%] Building CXX object CMakeFiles/dzik.dir/src/Utils/StringManipulation.cpp.o
[ 16%] Building CXX object CMakeFiles/dzik.dir/src/Utils/HostOperations.cpp.o
In file included from /home/runner/work/dzik-vm/dzik-vm/src/Utils/HostOperations.hpp:25,
                 from /home/runner/work/dzik-vm/dzik-vm/src/Utils/HostOperations.cpp:22:
/home/runner/work/dzik-vm/dzik-vm/src/Utils/Types.hpp:23:10: fatal error: expected: No such file or directory
   23 | #include <expected>
      |          ^~~~~~~~~~
compilation terminated.
gmake[2]: *** [CMakeFiles/dzik.dir/build.make:104: CMakeFiles/dzik.dir/src/Utils/HostOperations.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:153: CMakeFiles/dzik.dir/all] Error 2
gmake: *** [Makefile:136: all] Error 2
Error: Process completed with exit code 2.

Clang报错:

Run cmake --build /home/runner/work/dzik-vm/dzik-vm/build --config Release
[  5%] Building CXX object CMakeFiles/dzik.dir/src/main.cpp.o
[ 11%] Building CXX object CMakeFiles/dzik.dir/src/Utils/StringManipulation.cpp.o
In file included from /home/runner/work/dzik-vm/dzik-vm/src/Utils/StringManipulation.cpp:19:
In file included from /home/runner/work/dzik-vm/dzik-vm/src/Utils/StringManipulation.hpp:22:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/string:48:
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/stl_iterator.h:2618:35: error: missing 'typename' prior to dependent type name 'iterator_traits<_It>::iterator_category'
      { using iterator_category = iterator_traits<_It>::iterator_category; };
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/runner/work/dzik-vm/dzik-vm/src/Utils/StringManipulation.cpp:19:
In file included from /home/runner/work/dzik-vm/dzik-vm/src/Utils/StringManipulation.hpp:22:
In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/string:55:
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/basic_string.tcc:593:34: error: expected expression
      auto __r = std::move(__op)(auto(__p), auto(__n));
                                 ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/bits/basic_string.tcc:593:45: error: expected expression
      auto __r = std::move(__op)(auto(__p), auto(__n));
                                            ^
3 errors generated.
gmake[2]: *** [CMakeFiles/dzik.dir/build.make:90: CMakeFiles/dzik.dir/src/Utils/StringManipulation.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:153: CMakeFiles/dzik.dir/all] Error 2
gmake: *** [Makefile:136: all] Error 2
Error: Process completed with exit code 2.

两种错误均表明未启用C++23编译,请问我遗漏了哪些配置?


解决方案
  • 补全CMake标准配置
    仅设置CMAKE_CXX_STANDARD 23不足以强制编译器启用C++23,需要在CMakeLists.txt中添加以下配置:

    set(CMAKE_CXX_STANDARD 23)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)  # 强制要求编译器支持C++23,不满足则报错
    set(CMAKE_CXX_EXTENSIONS OFF)        # 禁用厂商扩展(如GNU++23),使用纯标准C++23
    

    这能避免CMake在编译器版本检测异常时自动回退到旧标准。

  • 升级Clang版本并配置默认值
    Ubuntu默认的Clang版本可能不支持完整C++23特性,需要安装高版本Clang(如17+),修改工作流中的Install Compilers步骤:

    sudo apt update && sudo apt install gcc-13 clang-17 build-essential
    

    同时在Set Default Compilers步骤中添加Clang的默认版本配置:

    # 配置GCC默认版本
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-13 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-13 --slave /usr/bin/gcov gcov /usr/bin/gcov-13
    # 配置Clang默认版本
    sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-17 100 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-17
    
  • CMake配置时显式指定标准(兜底措施)
    在CMake配置步骤中直接添加编译选项,确保命令行明确启用C++23:

    cmake -B ${{ steps.strings.outputs.build-output-dir }}
          -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
          -DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
          -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
          -DCMAKE_CXX_FLAGS="-std=c++23"
          -S ${{ github.workspace }}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:35:03