为何安装项目时默认安装Googletest目标?如何阻止并正常构建测试?
问题原因
- Googletest官方CMake脚本默认开启自身安装逻辑,由
INSTALL_GTEST和INSTALL_GMOCK两个缓存变量控制。只要这两个变量为ON,执行cmake --install时就会自动安装gtest、gmock等Googletest自身目标。 add_subdirectory(tests EXCLUDE_FROM_ALL)仅控制tests目录下的目标是否加入默认构建的ALL目标,无法影响Googletest自身的安装规则。只要Googletest的CMake脚本被执行(比如构建测试目标时会触发),其安装规则就会被注册,最终执行cmake --install时仍会安装Googletest。
解决办法
方法一:禁用Googletest的安装开关
在引入Googletest之前,设置INSTALL_GTEST和INSTALL_GMOCK为OFF,让Googletest的CMake脚本不生成自身的安装规则。
- 若在根CMakeLists.txt中添加tests子目录,先设置变量再执行
add_subdirectory:
# 禁用Googletest自身的安装 set(INSTALL_GTEST OFF CACHE BOOL "") set(INSTALL_GMOCK OFF CACHE BOOL "") add_subdirectory(tests)
- 若在tests目录内引入Googletest(比如通过
add_subdirectory(googletest)),则在该操作前设置变量:
# tests/CMakeLists.txt set(INSTALL_GTEST OFF CACHE BOOL "") set(INSTALL_GMOCK OFF CACHE BOOL "") add_subdirectory(googletest) # 配置你的测试可执行目标 add_executable(AllTests test_code.cpp) target_link_libraries(AllTests gtest_main)
此方式下,cmake --build build会默认构建测试,cmake --install build时不会安装Googletest目标。
方法二:用FetchContent引入Googletest并控制安装
如果通过FetchContent拉取Googletest,直接在配置阶段禁用安装:
include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip ) # 禁用Googletest自身安装 set(INSTALL_GTEST OFF) set(INSTALL_GMOCK OFF) FetchContent_MakeAvailable(googletest) # 配置测试目标 add_executable(AllTests test_code.cpp) target_link_libraries(AllTests gtest_main)
这种方式无需手动管理Googletest源码,同时能彻底阻止其被安装。
额外说明:默认不构建测试的场景
如果希望测试目标默认不构建,仅在指定时才构建,可结合EXCLUDE_FROM_ALL和上述禁用安装的设置:
# 根CMakeLists.txt set(INSTALL_GTEST OFF CACHE BOOL "") set(INSTALL_GMOCK OFF CACHE BOOL "") add_subdirectory(tests EXCLUDE_FROM_ALL) # 可选:给测试目标设置便捷触发目标 add_custom_target(run_tests) add_dependencies(run_tests AllTests)
此时执行cmake --build build不会构建测试,执行cmake --build build --target run_tests(或直接指定AllTests)可构建测试,且安装时不会包含Googletest目标。
内容的提问来源于stack exchange,提问作者pm100
相关产品推荐
相关产品推荐

