You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时依赖的符号实现没有被链接到测试程序中。

修复步骤

  1. 补全测试CMake的依赖引入:在test目录的CMakeLists.txt中添加和顶层一致的两个sensor cmake模块引入语句,保证sensor框架的自动代码生成、依赖链接逻辑对测试代码生效。
  2. 补全头文件搜索路径:在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/
            )
    
  3. (可选优化)封装公共代码为静态库:避免在两个编译目标中重复引用check_dummy.cpp,可以在顶层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)
    
    测试CMake修改为直接链接静态库,不需要再重复引入check_dummy.cpp:
    TARGET_LINK_LIBRARIES(${PROJECT_NAME}
            gtest
            gmock
            check_dummy_lib
            ${SENSOR_LIB}
            )
    

内容的提问来源于stack exchange,提问作者Dolev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:54:03