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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:16