如何避免安装步骤中复制FetchContent拉取的googletest模块文件
基于googletest库的C++测试项目,使用CMake构建,通过FetchContent从Git拉取googletest。运行正常,但执行安装步骤时,gtest/gmock的头文件和库文件会被冗余复制到安装目录,这些文件并非测试程序运行所需,如何禁用该行为?
项目相关文件及操作步骤如下:
CMakeLists.txt
cmake_minimum_required(VERSION 3.20) project(test) include(FetchContent) FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1 ) FetchContent_MakeAvailable(googletest) add_executable(test main.cpp) target_link_libraries(test gtest_main) install(TARGETS test)
main.cpp
#include <gtest/gtest.h> int add(int a, int b) { return a + b; } TEST(testCase, testAdd) { EXPECT_EQ(add(2, 3), 5); }
执行命令
mkdir build cd build cmake .. cmake --build . --config Release cmake --install . --prefix ../install
Windows环境下生成的../install目录包含:
- bin\test.exe(符合预期)
- include\gmock...和include\gtest...(冗余头文件)
- lib\gmock.lib、lib\gmock_main.lib等(冗余库文件)
怀疑该行为由FetchContent_MakeAvailable导致,想知道这是否仅针对googletest,以及如何调整。
该问题并非googletest独有,本质是FetchContent拉取的第三方项目默认启用了自身的安装规则,执行cmake --install时这些规则会被触发。以下是几种解决方法:
方法1:禁用gtest/gmock的安装目标
googletest本身提供了CMake选项控制是否安装自身文件,在调用FetchContent_MakeAvailable前设置INSTALL_GTEST和INSTALL_GMOCK为OFF即可:
cmake_minimum_required(VERSION 3.20) project(test) include(FetchContent) FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1 ) # 强制禁用gtest和gmock的安装规则 set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) set(INSTALL_GMOCK OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) add_executable(test main.cpp) target_link_libraries(test gtest_main) install(TARGETS test)
FORCE参数用于覆盖googletest自身CMake配置中的默认值,确保设置生效。
方法2:用EXCLUDE_FROM_ALL隔离第三方项目
如果是其他没有专属开关的第三方库,可以在FetchContent_Declare时添加EXCLUDE_FROM_ALL参数,让第三方项目的目标默认不纳入顶级构建的ALL目标,同时不会触发其安装规则:
FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1 EXCLUDE_FROM_ALL YES )
这种方式更通用,适用于大多数第三方依赖,但需注意如果第三方库有你需要的额外安装目标,需手动启用。
方法3:安装时指定组件(仅部分场景适用)
如果项目划分了多个组件,可以在install命令中指定组件,安装时只安装目标组件:
install(TARGETS test COMPONENT Runtime)
执行安装时添加组件参数:
cmake --install . --prefix ../install --component Runtime
这种方式只是规避冗余文件的安装,并未从根源禁用第三方库的安装规则,不如前两种方法彻底。
内容的提问来源于stack exchange,提问作者AntonK

