CMake引入googletest编译时报LNK2019未解析外部符号错误如何解决
问题解决方法
错误原因
- 报错的两个未解析符号
getQueriesSchema、getSessionSchema是CheckDummySensor类继承sensor框架要求实现的虚函数,对应的实现代码/依赖由顶层CMake引入的两个sensor专属cmake模块自动处理:INCLUDE("${SENSORINFRA_PREFIX}/cmake/sensor_main.cmake") INCLUDE("${SENSORINFRA_PREFIX}/cmake/sensor_schemata.cmake") - 测试目录的CMake没有引入上述两个模块,也没有匹配顶层的编译配置,导致编译
check_dummy.cpp时依赖的符号实现没有被链接到测试程序中。
修复步骤
- 补全测试CMake的依赖引入:在test目录的CMakeLists.txt中添加和顶层一致的两个sensor cmake模块引入语句,保证sensor框架的自动代码生成、依赖链接逻辑对测试代码生效。
- 补全头文件搜索路径:在test的
INCLUDE_DIRECTORIES配置中补充顶层包含的路径,避免隐性头文件缺失问题:INCLUDE_DIRECTORIES(BEFORE ${CMAKE_INSTALL_PREFIX}/include ${CMAKE_INSTALL_PREFIX}/include/valijson ${CMAKE_INSTALL_PREFIX}/include/sensor ${FMT_PATH}/include/ ${LOGGER_PATH}/src/ ${PROJECT_SOURCE_DIR}/../src/ ) - (可选优化)封装公共代码为静态库:避免在两个编译目标中重复引用
check_dummy.cpp,可以在顶层CMake中将业务代码编译为静态库,顶层可执行文件和测试可执行文件都链接该静态库,保证两边编译配置完全一致:
顶层CMake修改示例:
测试CMake修改为直接链接静态库,不需要再重复引入# 新增静态库目标 ADD_LIBRARY(check_dummy_lib STATIC src/check_dummy.h src/check_dummy.cpp) TARGET_LINK_LIBRARIES(check_dummy_lib ${FMT_LIB} ${SENSOR_LIB}) # 原有可执行目标改为链接静态库,仅保留入口文件即可 ADD_EXECUTABLE(${PROJECT_NAME} src/main.cpp) TARGET_LINK_LIBRARIES(${PROJECT_NAME} check_dummy_lib)check_dummy.cpp:TARGET_LINK_LIBRARIES(${PROJECT_NAME} gtest gmock check_dummy_lib ${SENSOR_LIB} )
内容的提问来源于stack exchange,提问作者Dolev
相关产品推荐
相关产品推荐

