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++-17CMake配置时显式指定标准(兜底措施)
在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
相关产品推荐
相关产品推荐

