选 ubuntu-20.04 更稳,避免 ubuntu-latest 切换至 22.04 导致 gcc/ABI/CMake 版本不兼容;需显式安装对应 dev 包、正确使用 Threads::Threads、启用 CMAKE_CXX_STANDARD_REQUIRED 并显式运行 ctest。

GitHub Actions 里用 ubuntu-latest 还是 ubuntu-20.04?
选 ubuntu-20.04 更稳。虽然 ubuntu-latest 看起来省心,但它可能突然切到 22.04,而后者默认带 gcc-11,如果你的 C++ 项目依赖 gcc-9 或 gcc-10(比如用了某些旧版 libstdc++ ABI),CI 就会静默链接失败或运行时报 GLIBCXX_3.4.29 not found。
- 显式写死
ubuntu-20.04,避免环境漂移 - 如果必须用新系统,就同步指定编译器:
sudo apt install g++-12并用CXX=g++-12覆盖 -
ubuntu-22.04自带cmake 3.22,但很多老项目CMakeLists.txt要求3.10以上即可,别盲目升级
如何让 cmake 正确找到 Boost 或 OpenCV?
GitHub Actions 默认不装第三方库,find_package(Boost) 直接报 Could not find Boost 是常态。别指望 apt install libboost-all-dev 全能覆盖——它装的是头文件+常用动态库,但如果你项目用 Boost::filesystem 且开了 STATIC 链接,就得额外装 libboost-filesystem-dev 和 libboost-system-dev。
- 先查文档:对应 Ubuntu 版本下,库的
dev包名是什么(比如libopencv-dev对应 OpenCV 4.x,libopencv-dev在 20.04 是 4.2,22.04 是 4.5) - 用
apt list --installed | grep boost在调试 job 里确认实际装了哪些 - 若需特定版本(如 Boost 1.75),用
vcpkg或conan更可靠,但会拖慢 CI 时间
make 报错 undefined reference to `pthread_create' 怎么办?
这不是你漏了 -lpthread,而是 CMake 默认没开 Threads::Threads 导入目标。现代 CMake 推荐用 target_link_libraries(myapp PRIVATE Threads::Threads),而不是手写 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") —— 后者会让所有 target 都带 pthread,还可能干扰 sanitizer 编译。
- 检查
CMakeLists.txt里是否漏了find_package(Threads REQUIRED) - 确认链接语句写在
add_executable之后,且 target 名拼写一致(大小写敏感) - 如果用
add_compile_options(-pthread),记得同时加add_link_options(-pthread),否则链接阶段仍失败
为什么 clang++ 编译通过,g++ 却报 error: ‘make_unique’ is not a member of ‘std’?
因为 std::make_unique 是 C++14 特性,而 GitHub Actions 的 g++-9 默认只认 -std=gnu++14,不是 -std=c++14;有些项目 CMake 设置了 set(CMAKE_CXX_STANDARD 14),但没设 set(CMAKE_CXX_STANDARD_REQUIRED ON),导致 g++ 降级到 c++98 模式编译。
立即学习“C++免费学习笔记(深入)”;
- 在
CMakeLists.txt开头加set(CMAKE_CXX_STANDARD_REQUIRED ON) - 显式指定方言:
set(CMAKE_CXX_STANDARD 17)比14更少踩坑(std::optional、std::string_view更常用) - Clang 对标准宽松,G++ 更严格——CI 用 G++ 才更贴近实际 Linux 发行版环境
最常被跳过的其实是 ctest 的启用方式:光写 add_test 不够,得在 CI step 里显式跑 cmake --build build --target test 或 ctest --test-dir build,否则测试永远不执行。



















