使用CMake编译含doctest.h的项目出现链接错误,手动编译正常如何解决
问题解决方法
错误原因
你编写的CMakeLists.txt中add_executable指令语法不符合规范:
CMake的add_executable要求第一个参数为生成的可执行目标名称,后续参数才是参与编译的源文件列表。你当前的写法将doctest_main.cpp识别为了可执行文件名,实际仅tests.cpp参与了编译:
- 包含main函数和doctest完整实现的
doctest_main.cpp没有参与编译,因此链接阶段既找不到main函数入口,也找不到doctest相关的函数实现,就会出现你遇到的未定义引用报错。
修复方案
将project/CMakeLists.txt中的add_executable部分修改为正确写法即可,示例如下:
cmake_minimum_required(VERSION 3.16) project(project) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 可选配置,强制要求编译器支持C++17 add_compile_options(-Wall -Wextra -Werror) # 第一个参数为生成的可执行文件名,后面跟所有需要编译的源文件 add_executable(unit_test doctest_main.cpp tests.cpp)
验证步骤
- 清空之前生成的错误构建缓存:删除整个
build目录 - 重新执行构建流程:
project> mkdir build && cd build project/build> cmake .. project/build> cmake --build .
- 运行生成的测试可执行文件:
project/build> ./unit_test
内容的提问来源于stack exchange,提问作者rvedtsaneon
相关产品推荐
相关产品推荐

