如何在googletest中为测试可执行文件添加多源文件且避免重定义错误
问题根因
你遇到的多定义链接错误核心来自两个常见问题:
- 你的CMake配置没有将
my_library_dir下的业务代码编译为独立编译单元,业务符号没有统一生成 - 如果头文件中存在非
inline的函数实现、非extern的全局变量定义,多个测试源文件分别引入头文件后,会在每个测试的编译单元中生成重复符号,链接阶段就会冲突
你当前的临时方案是将所有测试合并为单个编译单元,规避了重复符号冲突,但不符合工程化实践。
正确修改方案
你需要先将自有业务代码编译为独立静态库,再让测试目标链接该库,修改后的完整CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.14) project(my-library-testing) # 只需要设置这两行就可以指定C++标准,冗余的flag配置可以删掉 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/e2239ee6043f73722e7aa812a459f54a28552929.zip ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) enable_testing() # 新增:编译自有业务代码为静态库 add_library(my_library STATIC my_library_dir/obj1.cpp my_library_dir/obj2.cpp ) # 给静态库配置公开头文件搜索路径,依赖该库的目标会自动继承该路径 target_include_directories(my_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) add_executable( library_test normTest1.cpp normTest2.cpp deathTest1.cpp deathTest2.cpp ) # 新增:测试目标链接自己的业务库 target_link_libraries( library_test PRIVATE gtest_main my_library ) include(GoogleTest) gtest_discover_tests(library_test)
额外检查项
如果修改后仍然存在多定义错误,检查my_library.h及关联头文件:
- 所有写在头文件里的函数实现都要加
inline关键字 - 全局变量只在头文件中加
extern声明,具体定义放到对应的.cpp文件中
内容的提问来源于stack exchange,提问作者joeymaths
相关产品推荐
相关产品推荐

