CMake打包gtest/gmock库:如何将头文件与库文件一同导出?
解决gtest/gmock静态库打包时头文件导出问题
为节省编译时间,尝试将gtest/gmock打包为静态库。当前CMake脚本可生成库文件并输出到../lib目录,但无法将gtest/gmock的头文件一同导出到该目录,寻求解决方法。对应的CMake代码如下:
cmake_minimum_required(VERSION 3.1...3.22) project(gtest) set(COMPILER_DIRECTIVES "-O0 -g3 -Wall -MMD -MP") set(CMAKE_CXX_FLAGS "${COMPILER_DIRECTIVES}") set(CMAKE_EXE_LINKER_FLAGS "") set(SOURCE ${CMAKE_SOURCE_DIR}) # Overrides #set(CMAKE_VERBOSE_MAKEFILE ON) set(gtest_headers ${SOURCE}/googlemock ${SOURCE}/googlemock/include ${SOURCE}/googletest ${SOURCE}/googletest/include ) include_directories( ${gtest_headers} ) # Source files file(GLOB_RECURSE googletest_sources CONFIGURE_DEPENDS ${SOURCE}/googlemock/src/*.cc ${SOURCE}/googletest/src/*.cc ) list (REMOVE_ITEM googletest_sources ${SOURCE}/googletest/src/gtest_main.cc ${SOURCE}/googlemock/src/gmock-all.cc ${SOURCE}/googletest/src/gtest-all.cc ) add_library(${PROJECT_NAME} STATIC ${googletest_sources}) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) target_include_directories(${PROJECT_NAME} PUBLIC ${gtest_headers} ) set_target_properties(${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "../lib" LIBRARY_OUTPUT_DIRECTORY "../lib" OUTPUT_NAME ${PROJECT_NAME} )
解决方案
方法一:使用CMake的install命令(推荐)
在现有脚本末尾添加install规则,明确指定头文件和库的安装路径:
# 将gtest/gmock的头文件安装到../lib/include目录 install(DIRECTORY ${SOURCE}/googlemock/include/ DESTINATION ../lib/include) install(DIRECTORY ${SOURCE}/googletest/include/ DESTINATION ../lib/include) # 安装编译好的静态库 install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ../lib)
执行编译命令时加上安装目标:
cmake --build . --target install
即可同时将库文件和头文件导出到指定目录。
方法二:自定义拷贝目标
如果不想使用install流程,可以添加自定义目标,让编译时自动复制头文件:
# 创建自定义目标用于拷贝头文件 add_custom_target(copy_gtest_headers ALL COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE}/googlemock/include/ ../lib/include/ COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE}/googletest/include/ ../lib/include/ COMMENT "Copying gtest/gmock headers to ../lib/include" ) # 让静态库目标依赖拷贝目标,确保编译库前先完成头文件拷贝 add_dependencies(${PROJECT_NAME} copy_gtest_headers)
执行常规编译命令(如make或cmake --build .)时,头文件会自动被复制到../lib/include目录。
注意事项
- 建议将头文件放到
../lib/include子目录,而非与库文件同级,后续使用时只需指定../lib/include作为include路径即可,结构更规范。 - 原gtest/gmock的头文件在
include目录下已包含gtest、gmock子目录,拷贝后会自动保留层级,无需额外调整。
内容的提问来源于stack exchange,提问作者bas
相关产品推荐
相关产品推荐

