Linux环境下C++项目集成GoogleMock出现链接错误求助
解决GoogleMock链接错误:未定义GTest相关符号问题
你遇到的是典型的依赖缺失导致的链接错误——GoogleMock(gmock)本身深度依赖GoogleTest(gtest)库,而且gtest还需要POSIX线程库(pthread)的支持,但你的配置里只链接了gmock,完全没处理这些依赖项,所以编译器找不到gtest相关的函数实现。
我来一步步帮你修正问题:
1. 重新正确编译完整的GTest和GMock库
你之前的编译步骤有问题:现在GoogleMock已经完全整合到GoogleTest仓库里了,不需要单独克隆googlemock。正确的编译流程应该是:
- 克隆完整的googletest仓库:
git clone https://github.com/google/googletest.git cd googletest mkdir build && cd build - 编译生成所有需要的库:
编译完成后,cmake .. && makebuild/lib目录下会生成四个静态库:libgmock.a、libgmock_main.a、libgtest.a、libgtest_main.a,把这四个库都复制到你项目的lib目录下。
2. 修改CMakeLists.txt,补全依赖链接
你的原配置只链接了gmock,但gmock的内部实现大量调用gtest的函数,同时gtest需要pthread来处理线程相关逻辑。修改后的CMakeLists.txt应该是这样:
project(blockchain) cmake_minimum_required(VERSION 2.6) set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}) file(GLOB CPPS "*.cpp") include_directories("../inc/") link_directories("../lib/") add_definitions(-Wall -O2 -std=c++11) add_executable(${PROJECT_NAME} ${CPPS}) # 关键:补全gtest和pthread依赖 target_link_libraries(blockchain gmock gtest pthread) install(TARGETS ${PROJECT_NAME} DESTINATION bin)
3. 重新编译验证
回到项目的build目录,执行:
cmake .. && make
这次应该就能顺利通过链接,不会再出现那些未定义符号的错误了。
额外优化建议(可选)
如果你不想手动复制头文件和库文件,可以用CMake的find_package机制来自动查找依赖,这样更简洁也更易维护:
project(blockchain) cmake_minimum_required(VERSION 2.6) set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}) file(GLOB CPPS "*.cpp") # 自动查找GTest和GMock find_package(GTest REQUIRED) find_package(GMock REQUIRED) # 自动引入头文件目录 include_directories(${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS}) add_definitions(-Wall -O2 -std=c++11) add_executable(${PROJECT_NAME} ${CPPS}) # 链接自动找到的库和pthread target_link_libraries(blockchain ${GMOCK_LIBRARIES} ${GTEST_LIBRARIES} pthread) install(TARGETS ${PROJECT_NAME} DESTINATION bin)
使用这种方式的前提是你已经把googletest安装到了系统默认路径,或者编译时通过CMAKE_PREFIX_PATH指定了googletest的安装目录。
内容的提问来源于stack exchange,提问作者typemoon
相关产品推荐
相关产品推荐

