GTest项目CMake构建链接错误修复:非命令行运行解决方案
解决GTest在CMake构建中出现未定义引用的链接错误
我之前也碰到过一模一样的问题——手动编译安装GTest后,用g++命令行编译测试代码完全正常,但CMake构建就一堆testing相关函数的未定义引用错误。核心原因很简单:你在命令行里手动指定了链接GTest库和线程库,但CMake配置里没做这件事。
下面给你几种靠谱的解决方案,按推荐程度排序:
方案1:用CMake的find_package自动查找GTest(推荐)
因为你已经把GTest库安装到了系统默认的/usr/lib路径,CMake的find_package可以自动找到它的头文件和库文件。只需要写一个简单的CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(AddTest) # 查找系统中的GTest库 find_package(GTest REQUIRED) # 引入GTest的头文件路径 include_directories(${GTEST_INCLUDE_DIRS}) # 生成测试可执行文件 add_executable(test main.cpp) # 链接GTest库和线程库(GTest依赖pthread) target_link_libraries(test PRIVATE ${GTEST_LIBRARIES} pthread)
把这个文件放到和你的main.cpp同目录下,然后执行常规的CMake构建步骤:
mkdir build && cd build cmake .. make ./test
方案2:手动指定库和头文件路径(适合自定义安装路径)
如果find_package没找到GTest(比如你把库装在了非系统默认路径),可以手动指定头文件和库的位置:
cmake_minimum_required(VERSION 3.10) project(AddTest) # 指定GTest的头文件路径(如果你的头文件不在/usr/include/gtest,替换成实际路径) include_directories(/usr/include/gtest) # 生成测试可执行文件 add_executable(test main.cpp) # 手动链接GTest库和线程库 target_link_libraries(test PRIVATE gtest pthread)
方案3:用FetchContent自动下载构建GTest(最省心的跨平台方案)
手动安装GTest容易遇到路径、版本兼容问题,更推荐用CMake的FetchContent模块,让CMake自动下载、编译GTest,完全不用手动安装:
cmake_minimum_required(VERSION 3.14) project(AddTest) # 引入FetchContent模块 include(FetchContent) # 声明要获取的GTest版本(这里用v1.14.0,你可以换成最新版) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip ) # Windows下防止覆盖父项目的编译设置,Linux/macOS可以忽略这条 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) # 下载并构建GTest FetchContent_MakeAvailable(googletest) # 生成测试可执行文件 add_executable(test main.cpp) # 链接GTest的main库(包含了main函数,你甚至可以删掉自己写的main函数) target_link_libraries(test PRIVATE GTest::gtest_main) # 启用CMake的测试功能,方便后续运行测试 enable_testing() add_test(NAME AddTest COMMAND test)
用这个方案的话,你甚至不需要提前安装GTest,CMake会帮你搞定一切,而且跨平台兼容性更好。
为什么命令行没问题?
你用g++ main.cpp -o test -lgtest -lpthread的时候,-lgtest告诉编译器链接GTest库,-lpthread链接线程库(GTest内部用到了线程)。而默认的CMake配置不会自动帮你链接这些库,所以才会出现未定义引用的错误。
内容的提问来源于stack exchange,提问作者user8265329
相关产品推荐
相关产品推荐

