在GitHub Actions中使用CMake与Googletest执行构建命令失败求助
解决GitHub Actions中CMake找不到Googletest的问题
问题根源
本地构建正常是因为你已经确保googletest目录下存在完整代码(要么手动克隆了子模块,要么把代码复制到了项目里),但GitHub Actions默认克隆仓库时不会自动拉取git子模块,也不会包含未提交到仓库的外部代码,导致CMake执行add_subdirectory(googletest)时找不到目标文件。
解决方案
下面给出几种靠谱的解决方式,按推荐优先级排序:
1. 使用CMake FetchContent自动拉取Googletest
修改项目根目录的CMakeLists.txt,替换原有的add_subdirectory(googletest)逻辑,改用CMake的FetchContent模块自动下载并构建Googletest:
# 替换原来的add_subdirectory(googletest) include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1 # 可根据需求替换为最新稳定版本 ) # 禁用Googletest的安装步骤,避免干扰主项目 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest)
这种方式不需要手动管理子模块或外部代码,本地和GitHub Actions环境下CMake都会自动处理依赖,彻底避免路径问题。
2. 修正GitHub Actions的代码拉取步骤,拉取子模块
如果你的googletest是作为git子模块添加到项目中的,需要在GitHub Actions的workflow文件里,让checkout动作拉取子模块:
修改你的.github/workflows/xxx.yml文件中的checkout步骤:
- name: 拉取代码 uses: actions/checkout@v4 with: submodules: true # 拉取所有直接子模块 # 如果存在嵌套子模块,再加下面一行: # submodules: recursive
如果子模块需要完整的提交历史,还可以加上fetch-depth: 0参数:
- name: 拉取代码 uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive
3. 在GitHub Actions中手动克隆Googletest
如果以上两种方式都不适用,可以在构建前手动克隆Googletest到指定目录:
在workflow文件中添加步骤:
- name: 克隆Googletest run: | git clone https://github.com/google/googletest.git ./googletest cd ./googletest git checkout release-1.12.1 # 指定对应版本
这种方式比较繁琐,仅作为临时方案使用。
验证
修改后重新触发GitHub Actions构建,CMake就能找到googletest目录下的CMakeLists.txt,顺利完成配置和构建。
内容的提问来源于stack exchange,提问作者ThrowsError
相关产品推荐
相关产品推荐

