首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用cmake和doctest.h时出现链接器错误(它在没有cmake的情况下工作)

在使用CMake和doctest.h时遇到链接器错误,通常是因为CMake配置不正确或缺少必要的库文件。以下是一些基础概念、可能的原因及解决方法:

基础概念

  1. CMake:一个跨平台的构建系统生成器,用于自动化软件构建过程。
  2. doctest.h:一个轻量级的C++测试框架,不需要外部依赖。

可能的原因

  1. CMakeLists.txt配置错误:可能没有正确配置测试目标或链接库。
  2. 缺少库文件:doctest.h可能需要某些库文件,但这些文件没有被正确链接。
  3. 编译器或链接器选项:可能缺少必要的编译器或链接器选项。

解决方法

以下是一个简单的CMakeLists.txt示例,展示了如何正确配置doctest.h:

代码语言:txt
复制
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 添加源文件
add_executable(MyProject main.cpp test.cpp)

# 添加doctest库
add_subdirectory(path/to/doctest)

# 链接doctest库
target_link_libraries(MyProject doctest)

# 启用测试
enable_testing()
add_test(NAME MyProjectTest COMMAND MyProject)

详细步骤

  1. 安装doctest.h: 确保你已经下载并放置了doctest.h库文件。假设doctest.h在path/to/doctest目录下。
  2. 创建CMakeLists.txt: 在你的项目根目录下创建一个CMakeLists.txt文件,并添加上述示例代码。
  3. 配置和构建项目: 在项目根目录下运行以下命令:
  4. 配置和构建项目: 在项目根目录下运行以下命令:
  5. 运行测试: 如果一切配置正确,你可以运行测试:
  6. 运行测试: 如果一切配置正确,你可以运行测试:

参考链接

常见链接器错误及解决方法

  1. undefined reference to `doctest::Context::Context()'
    • 确保target_link_libraries(MyProject doctest)正确添加。
    • 确保doctest库路径正确。
  • 找不到库文件
    • 确保库文件路径正确,并且库文件存在。
    • 使用link_directories命令添加库路径:
    • 使用link_directories命令添加库路径:

通过以上步骤,你应该能够解决使用CMake和doctest.h时遇到的链接器错误。如果问题仍然存在,请检查编译器和链接器的输出日志,以获取更多详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ninja Compiling the C compiler identification source file CMakeCCompilerId.c fai

使用CMake构建项目,它会尝试检测您C编译以确定它版本功能特性。 当CMake执行编译检测时,它会尝试编译一个源代码文件CMakeCCompilerId.c。...通过这样配置,CMake将能够找到并使用正确C编译编译CMakeCCompilerId.c文件,从而避免了出现“ninja Compiling the C compiler identification...CMakeCCompilerId.c是由CMake生成一个源文件,用于在构建过程中确定C编译身份功能。它在构建过程中被用来测试编译功能特性,并产生一个唯一标识符来表示编译。...当您使用CMake构建一个项目CMake会自动检测系统中可用C编译,并使用CMakeCCompilerId.c来测试编译能力。...它在项目的构建过程中起到了关键作用,确保项目能够正确地与所选C编译配合工作

37310

面向 C++ 现代 CMake 教程(二)

ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) 我认为在使用任何软件未记录功能要小心,因为它们可能会在没有警告情况下消失。...>与COMPILE_LANG_AND_ID类似,但检查链接步骤使用语言。使用此表达式指定特定语言和链接组合目标的链接库、链接选项、链接目录链接依赖项。...预处理对实际 C++代码一无所知,通常只是一个更高级查找替换工具。然而,它在构建高级程序中工作至关重要;将代码分成部分并在多个翻译单元之间共享声明是代码可重用基础。 接下来是语言分析。...当你不将所有警告视为错误时,这很好,但当你这样做,有一天你会发现你构建开始在没有代码更改情况下失败,或者更令人沮丧是,当你需要快速修复一个与新警告完全无关问题。...当启用此选项,一些面向调试宏可能不会工作。其中之一就是assert,它在头文件中可用。

56300
  • 面向 C++ 现代 CMake 教程(三)

    不幸是,在计算机科学中,几乎没有什么事情是容易链接也不例外。 为了获得正确结果,我们需要跟随整个故事——了解链接究竟如何工作,并正确掌握基础知识。...动态链接重复符号 名称解析规则(ODR)对静态库对象文件作用完全一样,但当我们使用SHARED库构建代码,情况就不那么明确了。链接将允许在此处重复符号。...搜索将从存储在CMAKE_MODULE_PATH变量中路径开始(默认情况下这个变量是空)。当项目想要添加使用外部查找模块,这个变量可以被项目配置。...换句话说,它实现了以下功能: 查找库编译所在位置 提供辅助函数,教会 CMake 如何调用.proto文件定制编译 添加包含包含链接所需路径变量 在大多数情况下,当你调用...当我们执行unit_tests二进制文件(它在gtest_discover_tests宏中发生),覆盖信息文件将不匹配,我们将收到一个SEGFAULT(段错误错误

    54600

    面向 C++ 现代 CMake 教程(四)

    使用静态检查 静态程序分析是检查源代码而不实际运行编译版本过程。严格应用静态检查显著提高了代码质量:它变得更加一致,更少出现错误。引入已知安全漏洞机会也减少了。...明智开发者知道,在要求不高环境中遵循类似实践并不会有什么坏处,尤其是在采用成本如此之低情况下。在构建过程中使用静态分析不仅比手动查找修复错误便宜得多;而且通过 CMake 很容易启用。...如果你编辑没有这个选项,你仍然可以通过使用第三方报告生成器获得更清晰错误视图。...管理版本化共享库符号链接安装目标平台可能使用符号链接来帮助链接发现当前安装共享库版本。...摘要 在没有CMake 这样工具情况下,以跨平台方式编写安装脚本是一项极其复杂任务。虽然设置还需要一点工作,但它是一个更加流畅过程,紧密地与本书到目前为止使用所有其他概念技术相关联。

    59200

    小白入门笔记:CMake编译过程详解

    1.2 CMake设计初衷是为了什么? CMake设计出发点在于面向开发者,而开发者工作流程基本是: 设计、编码测试;理想情况下,这个过程应该从一个简单地按钮开始。...CMake好似一个在构建过程中工作“协调”,它清楚哪些步骤需要完成,理解最终目标是什么,以及忙碌于为构建工作找到合适“工人”“材料”。...值得注意是在查询${MyString1}过程中,CMake若是没有找到对应变量则会将其替换为空字符串并不会产生错误。另外,在通过${} 语法进行变量求值展开,是由内而外执行。...2.3 实用指令 2.3.1 message() 指令 CMake中打印指令,也就是message() 指令是用于将文本打印到标准输出,并且CMake通过提供MODE 参数,可以自定义输出样式,并且在出现错误情况下...配置,可以为Debug或Release构建设置相关选项或属性,例如:编译链接标志。控制生成构建系统使用配置变量是CMAKE_BUILD_TYPE。

    6K31

    CMake 秘籍(三)

    这样做,我们在 CMake 没有得到任何对不存在源文件文件依赖。然而,CMake 内置 C/C++文件依赖扫描在构建识别了它们,并且源文件被编译链接。...该命令可以帮助您确定: 您编译支持所需功能。 链接工作正常并理解特定标志。 使用find_package找到包含目录库是可用。...只需使用适当标志重新编译代码并链接必要库,您就可以调查调试与内存错误(地址消毒)、未初始化读取(内存消毒)、线程安全(线程消毒未定义行为(未定义行为消毒)相关问题。...否则,作为第一个参数传递标志只会在调用编译使用,导致错误否定结果。 在本节中还有一个要点需要注意,那就是使用字符串变量列表来设置编译标志。...如果在target_compile_optionstarget_link_libraries函数中使用字符串变量,将会导致编译/或链接错误CMake 会将这些选项用引号括起来,导致解析错误

    58920

    CMake 秘籍(二)

    它是如何工作 预处理定义是在配置CMake 在CMakeLists.txt中定义,并传递给预处理。...由于这些是我们项目的必需依赖项,如果找不到这些依赖项,配置将停止并出现错误。 请注意,我们明确要求 CMake 检测 Python 可执行文件安装。这是为了确保可执行文件、头文件库具有匹配版本。...如果失败,则表明系统上没有符合要求库。 每个编译在生成机器代码都会对符号进行名称混淆,不幸是,这项操作约定不是通用,而是编译依赖。...本教程将向您展示如何在使用 CMake 3.9 或更高版本,为简单 C++ Fortran 程序检测并链接 OpenMP 使用导入目标。...在底层,它将调用相同编译,并为其添加额外参数,如包含路径库,以成功构建并行程序。 包装在编译链接源文件实际应用哪些标志?我们可以使用编译包装--showme选项来探测这一点。

    58720

    面向 C++ 现代 CMake 教程(五)

    第四章,使用目标工作: 在这里,我们强调了现代 CMake 项目如何广泛使用目标。我们项目也将如此,以下原因是: 定义几个库可执行文件(用于测试生产)将使项目保持组织性并保持干燥....第五章,使用 CMake 编译 C++源代码: 没有编译 C++项目是不存在。基础知识相当简单,但 CMake 允许我们在许多方面调整此过程:扩展目标源、配置优化、提供调试信息。...第六章,使用 CMake 链接: 第六章为我们提供了关于链接(在任何项目中都有用)一般信息,其中大部分默认情况下就很有用。...,当涉及到这些文件并不会发挥任何作用——没有自动化行为或脚本可以使用。...本书第二部分教导我们如何使用 CMake 进行构建:如何使用目标,自定义命令,构建类型生成器表达式。我们深入探讨了编译技术细节,以及预处理优化配置。我们讨论了链接,并介绍了不同库类型。

    14500

    opencv recipe for target all failed解决

    检查CMake配置当你使用CMake生成编译文件,一个常见错误是由于配置文件错误引起。确保你使用CMake配置文件正确地指定了OpenCV安装路径必要依赖项。...若路径不正确,将会导致编译过程中链接错误。3. 清理并重新编译如果上述步骤都没有解决问题,你可以尝试清理之前生成编译文件并重新编译。...如果在编译出现"recipe for target 'all' failed"错误,可以尝试以下步骤解决:确保已正确安装OpenCV,并设置了正确包含路径库路径。...它提供了一种简化并标准化跨平台构建过程方法,可以在多个操作系统上生成各种编译构建系统所需配置文件。 CMake配置是指在使用CMake生成构建文件所需设置参数。...这些配置包括但不限于编译选项、库依赖、自定义构建选项等,帮助我们更方便地管理构建项目,同时保持跨平台兼容性一致性。

    78720

    面向 C++ 现代 CMake 教程(一)

    如果你使用是本书数字版,我们建议你亲自输入代码或从本书 GitHub 仓库(下一节中有链接)访问代码。这样做可以帮助你避免因复制粘贴代码而可能出现任何潜在错误。...CMake 首先创建一个空构建树,并收集有关它正在工作环境详细信息,例如架构、可用编译链接归档。此外,它检查一个简单测试程序是否可以正确编译。...反过来,这些构建工具将执行步骤,使用编译链接、静态动态分析工具、测试框架、报告工具以及你能想到任何其他工具来生成目标。...使用 ZIP 包,你将不得不将 CMake 二进制目录添加到PATH环境变量中,这样你才能在任何目录中使用它,而不会出现错误: 'cmake' is not recognized as an internal...当你第一次阅读 CMake 列表文件,你可能会觉得其中语言如此简单,以至于不需要任何特殊培训或准备。接下来内容经常是尝试引入变化实验代码实际尝试,而没有彻底理解它是如何工作

    1.2K01

    PaddlePaddle踩坑指北系列——MacOS安装

    错误 关键字:Configuring incomplete 问题描述:以源码方式在MacOS上安装出现Configuring incomplete, errors occured!...解决方法: 如上,当cmake找到python解释python库,如果安装了许多pythons,它总会找到不同版本Python。在这种情况下,您应该明确选择应该使用哪个python。...通过cmake显式设置python包。只要确保python libspython解释是相同python可以解决所有这些问题。...在这个环境中,我们可以自由地进行Paddle安装、使用开发工作,无需担心对系统自带Python影响。...如果在这篇文章中没有得到您所遇到问题解答,请不要着急。我们将即可推出后续问题解答报道,敬请期待~

    1.6K40

    基于OBS插件开发总结

    OBS Studio工程使用CMake进行管理,因此在特定平台进行编译,还需安装CMake(https://cmake.org/)处理生成对应平台工程。...(4)打开CMAKE,指定好源代码文件夹路径输出文件夹路径。注意是,OBS Studio工程默认情况下是编译UI。...这时可能会出现如下错误: ?       这是因为我们在下载OBS Studio工程没有下载完整,因为工程中这部分代码给独立成一个单独仓库了: ?       ...点击这个链接,即可跳到相应代码仓库中。下载好代码放到如下位置: ?       再次点击Configure,可以看到CMake顺利生成了VS工程。 ? ?...(7)启动调试时候可能会出现如下错误: ?       这是因为调试工作目录不一样,需要在VS中进行设置: ?       保存设置之后,即可成功启动调试了。

    5.5K90

    Ubuntu18.04安装Ros(最新最详细亲测)「建议收藏」

    安装Ros 将自动安装旧版Cmake3.10.2。所以在安装Ros之前,请先检查此先是否有安装Cmake。...如果有请再查看它版本例如 :cmake -version 显示:cmake version 3.20.5 安装Ros之后可能出现这种情况:在终端命令行输入 cmake-version 将会显示 cmake...对于这个问题解决办法“软链接”补充在本文末尾。 如果在此之前没有安装cmake,那对于Ros安装没什么影响。完全可以在安装ROS后,去Cmake官网安装一个新版cmake 再更改软链接即可。...Cmake安装链接设置见本文末尾 注意:如果遇到问题,先去评论区看看有没有其他人和你问题相同。...如果有||爬楼||方法,可以尝试开启后,直接执行 估计是一路通畅不会遇到什么问题。 最后向CSDN作者银大魔王 表示谢意,针对文中 rosdep init update 问题先前做了很多工作

    5.4K20

    CI 中一次单元测试覆盖率问题定位分析

    问题说明 最近一次开发人员提交代码有目录删除,CI编译环节单元测试都没有错误,但是单元测试覆盖率执行失败?...在源代码没有对应目录情况下,仍然在编译目录生成build/billing/pycheck/CMakeFiles/py_check.dir/。为什么呢?...问题转机 在根目录lib看动态库,看到 libpy_check.so ,在编译脚本(cmakefiles目录文件cmakefiles目录)搜索py_checkcmake.targetsset...编译在/src/build/lib没有找到libpy_check.so,链接了~/lib老版本库。 单元测试,生成改目录,执行单元测试覆盖率是出现错误。 是这样吗?需要进一步验证。...小结 在CMake编译,删除目录,不仅按照目录需要删除对应CMakeListscmake.dir中目录信息,还需要删除cmake.targets中动态库信息。

    1.1K20

    CMake 秘籍(四)

    对于更复杂模板,我们推荐使用外部工具,如 Jinja(参见jinja.pocoo.org)。 准备工作 print_info.c.inexample.f90文件与前一个方法相比没有变化。...后一种形式在version.h.in中没有使用,但它们经常出现使用 CMake 配置 shell 脚本。...还有更多 为了确保预处理变量仅在 CMake 变量被视为真常量定义,可以在即将配置头文件中使用#cmakedefine而不是#define,通过使用configure_file。...使用要求,如包含目录、编译标志链接库设置在OBJECT库上将正确继承。...在这种情况下,ancestors.f90evolution.f90都是PUBLIC,因为它们模块接口被库外部访问,而empty.f90模块接口没有被库外部访问,因此我们将此源文件标记为PRIVATE

    24920

    Rust 欧洲之声|Rust Cpp 互操作

    Rust没有稳定应用二进制接口(ABI)。这意味着Rust编译可以自由地改变它在生成二进制输出中如何表示数据类型或函数调用。当然,这使得以二进制形式交换数据成为一种挑战。...在C++方面的情况并没有太大不同:ABI是由编译定义。这就是为什么你不能混合使用MSVCGCC生成库。...另一个问题以内联(Inline)代码形式出现。这类代码不能直接用二进制方式调用。相反,它被插入到使用内联代码地方。这就要求编译能够编译相关代码。...在这种情况下,new_clientput都是安全。这些信息与Rust方面有关,但对被包装C++代码没有影响。 什么时候使用cxx? 当你可以控制API两边,它效果最好。...在Slint中,我们使用cpp crate来与有稳定APIC++ GUI工具包进行交互。它在这种情况下非常有效。 总结 你有广泛选择来整合C++Rust代码,但你总是需要生成语言绑定。

    3.5K21

    CMake 秘籍(六)

    默认情况下CMake 设置可执行文件 RPATH,假设它们将从构建树中运行。然而,在安装,RPATH 被清除,导致用户想要运行 hello-world_wDSO 出现问题。...然而,我们没有解决符号可见性问题。我们将使用当前节重新审视这两点。 准备工作 我们仍将主要使用与上一节相同代码,但我们需要修改src/CMakeLists.txtMessage.hpp头文件。...这分为两个阶段进行: 我们使用适当编译标志。 我们使用预处理变量(在我们例子中是message_EXPORT)来标记要导出符号。在编译,这些符号(如类函数)隐藏将被解除。...然而,如果你打算从相同源文件构建共享库和静态库,你需要一种方法来赋予message_EXPORT预处理变量在代码中两种情况下出现意义。...我们准备了一个名为IntelMKLINTERFACE库。这可以像任何其他目标一样使用,并将为任何依赖目标设置包含目录、编译选项链接库。

    36700

    CMake简易指南

    首行都应该加上最低版本限制,避免出现运行 CMake 版本过低导致不明错误,如:cmake_minimum_required(VERSION 3.14)关于 cmake 版本主要需要考虑操作系统以及...IDE 兼容,实际使用时尽可能使用更新版本 cmake 可以避免一些不必要错误。...中,在 cmake 配置加上-G Ninja即可,当存在CMakeCache.txt修改-G需要先将缓存文件CMakeCache.txt删除,CMakeCache.txt在编译根目录工作cmake...一般来说,CMAKE_C_COMPILERCMAKE_CXX_COMPILER分别指定 C C++编译,如修改则需要同时指定-DCMAKE_TOOLCHAIN_FILE=toolchain.cmake...:描述本地处理类型为了跨平台差分使用方便,一般会在一个地方检测当前需要编译平台变量,如:# 检测当前编译平台# iOS没有官方工具链,三方工具链部分设置名称为iOS,部分为IOS,此处统一改成小写

    81050

    CMake学习笔记(二)——CMake语法

    开关选项 BUILD_SHARED_LIBS 控制默认库编译方式。 注:如果未进行设置,使用ADD_LIBRARY没有指定库类型,默认编译生成库都是静态库。...这行命令是可选,我们可以不写这句话,但在有些情况下,如果CMakeLists.txt文件中使用了一些高版本cmake特有的一些命令时候,就需要加上这样一行,提醒用户升级到该版本之后再执行cmake。...; 指定链接目标文件需要链接外部库,效果类似于gcc编译参数-L,解决外部库依赖问题。...(5) COMPILE_FLAGS 设置附加编译标志,在构建目标内源文件被用到。 (6) LINKER_LANGUAGE 改变链接可执行文件或共享库工具。...构建或安装,如果平台支持符号链接,且链接支持so名称,那么恰当符号链接将会被创建。如果只指定两者中一个,缺失另一个假定为具有相同版本号。

    5.5K100
    领券