GitHub Actions中CMake构建Boost项目报Could NOT find Boost错误
问题场景
在GitHub Actions工作流中构建CMake项目时,本地Ubuntu 22.04 LTS环境、同版本基础镜像的Docker容器内均可正常完成构建,但使用GitHub Actions官方ubuntu-22.04运行器时构建失败。
报错信息
CMake Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find Boost (missing: Boost_INCLUDE_DIR system filesystem thread date_time chrono regex serialization program_options) Call Stack (most recent call first): /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE) /usr/local/share/cmake-3.23/Modules/FindBoost.cmake:2376 (find_package_handle_standard_args) CMakeLists.txt:261 (find_package)
相关配置
GitHub Actions工作流配置
install: name: Install Dependencies runs-on: ubuntu-22.04 needs: [ clean ] steps: - uses: actions/checkout@v2 - name: Install General run: | sudo apt-get update sudo apt-get install -y build-essential libboost-all-dev libssl-dev libffi-dev python3-dev gcc-11 g++-11 git cmake librocksdb-dev cron rpcbind libboost-system1.74.0 libboost-filesystem1.74.0 libboost-thread1.74.0 libboost-date-time1.74.0 libboost-chrono1.74.0 libboost-regex1.74.0 libboost-serialization1.74.0 libboost-program-options1.74.0 libicu70 build: name: Build Target runs-on: ubuntu-22.04 needs: [ install ] steps: - uses: actions/checkout@v2 - name: Create Build Dir run: mkdir build - name: CMake run: cmake -DCMAKE_CXX_FLAGS="-g0 -Os -fPIC -std=gnu++17" -DBoost_DEBUG=ON -DBoost_ARCHITECTURE=-x64 .. working-directory: build - name: Make run: make -j$(nproc) --ignore-errors working-directory: build
项目中Boost相关CMake配置
set(Boost_NO_BOOST_CMAKE ON) set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_STATIC_RUNTIME ON) find_package(Boost REQUIRED COMPONENTS system filesystem thread date_time chrono regex serialization program_options) message(STATUS "Boost Found: ${Boost_INCLUDE_DIRS}") include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
可正常构建的Dockerfile配置
FROM ubuntu:22.04 COPY . /usr/src/project_name WORKDIR /usr/src/project_name # install build dependencies RUN apt-get update && \ apt-get install -y \ build-essential \ libssl-dev \ libffi-dev \ python3-dev \ gcc-11 \ g++-11 \ git \ cmake \ librocksdb-dev \ libboost-all-dev \ libboost-system1.74.0 \ libboost-filesystem1.74.0 \ libboost-thread1.74.0 \ libboost-date-time1.74.0 \ libboost-chrono1.74.0 \ libboost-regex1.74.0 \ libboost-serialization1.74.0 \ libboost-program-options1.74.0 \ libicu70 # create the build directory RUN mkdir build WORKDIR /usr/src/project_name/build # build and install RUN cmake -DCMAKE_CXX_FLAGS="-g0 -Os -fPIC -std=gnu++17" .. && make -j$(nproc) --ignore-errors WORKDIR /usr/src/project_name/build/src
故障原因
- 核心原因:GitHub Actions中每个配置了
runs-on的Job都会运行在独立的临时虚拟机实例上,Job执行完成后实例会直接销毁,不同Job之间不共享系统环境、已安装软件包。当前配置把依赖安装放在独立的installJob中,后续buildJob启动时是完全干净的系统环境,根本没有安装Boost等依赖,自然无法找到Boost头文件和库文件。本地和Docker环境能正常构建,正是因为依赖安装和编译步骤在同一个持续运行的环境中执行,不存在环境隔离问题。 - 次要干扰项:CMake命令中添加的
-DBoost_ARCHITECTURE=-x64参数会干扰FindBoost模块的默认搜索逻辑,强制模块搜索带-x64后缀的Boost库文件,而Ubuntu源安装的原生Boost库没有该后缀,会进一步提升搜索失败概率。 - 冗余配置:依赖安装列表中单独列出的
libboost-system1.74.0等运行时包,会在安装libboost-all-dev时作为依赖自动安装,不需要重复指定,不会直接导致报错但属于无效配置。
修复方案
- 移除独立的
installJob,将依赖安装步骤直接移动到buildJob的步骤最前端,和后续CMake、编译步骤在同一个Job实例中执行,保证安装的依赖可以被编译流程直接读取。如果确实需要拆分Job减少重复执行时间,需要通过缓存动作持久化系统依赖,但对于apt安装的系统包,直接在同Job安装是稳定性最高的方案。 - 删除CMake执行命令中的
-DBoost_ARCHITECTURE=-x64参数,使用默认的架构检测逻辑搜索系统安装的Boost库。 - 清理apt安装列表中冗余的Boost运行时包条目,仅保留
libboost-all-dev即可覆盖所有需要的Boost组件。 - 若调整后仍有搜索问题,可在CMake步骤前添加
ls /usr/include/boost命令,验证Boost头文件是否确实安装到了默认系统路径。
内容的提问来源于stack exchange,提问作者user16891224
相关产品推荐
相关产品推荐

