带有 Catch 库的未解析外部符号

Posted

技术标签:

【中文标题】带有 Catch 库的未解析外部符号【英文标题】:Unresolved external symbol with Catch library 【发布时间】:2017-06-21 13:22:15 【问题描述】:

我正在迁移一些项目以使用 CMake 构建系统。现在我正在使用Catch 库添加带有一些单元测试的项目。它是仅标头库。旧的 Visual Studio 项目构建良好,但新的 CMake 项目提供未解决的外部符号链接器错误。我在我的一个源文件中定义了 CATCH_CONFIG_MAIN。添加了来自其他项目的测试所需的所有 cpp 文件,并且链接了其他测试项目所依赖的所有库。尽管如此,我只有从CMake 项目生成的未解决的外部符号错误:

ChipCountTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Catch::SourceLineInfo::SourceLineInfo(char const *,unsigned int)" (??0SourceLineInfo@Catch@@QAE@PBDI@Z) referenced in function "void __cdecl `anonymous namespace'::`dynamic initializer for 'autoRegistrar1''(void)" (??__EautoRegistrar1@?A0xb4291ec5@@YAXXZ)
1>FlyingChipRewardCalculatorUT.obj : error LNK2001: unresolved external symbol "public: __thiscall Catch::SourceLineInfo::SourceLineInfo(char const *,unsigned int)" (??0SourceLineInfo@Catch@@QAE@PBDI@Z)

显然我缺少将一些配置从 vcxproj 添加到 CMakeLists.txt 但我目前无法弄清楚。

【问题讨论】:

您显然缺少一些 Catch 库。如果在 VS 项目的链接器部分找不到它们;然后尝试在 Catch 的标头中查找#pragma comment( lib, "name-of-catch-library" ),这将导致链接器自动拾取命名库。 @Richard Critten 正如我所说,catch 库只是标头,没有 libs 您是否使用“官方”指令进行 CMake 集成? github.com/philsquared/Catch/blob/master/docs/build-systems.md(参见 CMake 部分) 能否请您提供一个minimal reproducible example 包括一些CMakeLists.txt 代码? 【参考方案1】:

在我的一个文件中:

#define CATCH_CONFIG_MAIN
#include <catch.hpp>

但我也使用 CMake 宏将预编译头添加到项目中:

add_precompiled_header ($TARGET_NAME
  $CMAKE_CURRENT_SOURCE_DIR/StdAfx.h
  $CMAKE_CURRENT_SOURCE_DIR/StdAfx.cpp)

这个宏在所有文件中强制包含预编译的头文件,但在其中我有#include &lt;catch.hpp&gt; 没有#define CATCH_CONFIG_MAIN,这是所有文件都需要的,除了一个。

我在宏中添加了选项以传递不包含预编译标头的文件列表,这解决了问题。

【讨论】:

【参考方案2】:

从您提供的上下文中推断出具体问题有点困难,但here 是用于 CMake 集成的官方 Catch 指令。

根据我在 Visual Studio 中使用它的经验 - 集成进展顺利。

【讨论】:

+1 感谢您向我介绍有关 CMake 集成的官方 Catch 文档,但我没有发现任何有用的问题.将 Catch 定义为接口库并将其添加为 target_link_libraries 中的依赖项是没有意义的,因为 Catch 是仅标头库,不需要单独的构建和链接。不过我试过了,这并没有改变任何东西。 @bobeff 您是否尝试使用确切的说明在您的新 CMake 环境中从头开始创建一个 catch 单元测试项目?也许它会帮助您找到确切的问题,因为目前没有足够的信息。从头开始可能会帮助您找到中断的步骤。【参考方案3】:

当我尝试在测试项目中启用预编译头选项的情况下使用 Catch 时,我最终会遇到链接器错误 LNK2019。

我仍然在我的项目中使用 stdafx.h 并禁用 Precompiled header 选项以便构建项目。

右键项目->配置属性->C/C++->预编译头文件->预编译头文件->不使用预编译头文件。

【讨论】:

【参考方案4】:

我有同样的错误,我通过将目标链接到 Catch2WithMain 解决了它

target_link_libraries( $PROJECT_TEST Catch2 Catch2WithMain)
set_property(TARGET $PROJECT_TEST PROPERTY CXX_STANDARD 14)
set_property(TARGET $PROJECT_TEST PROPERTY CXX_EXTENSIONS OFF)

【讨论】:

以上是关于带有 Catch 库的未解析外部符号的主要内容,如果未能解决你的问题,请参考以下文章

具有菱形结构的未解析外部符号

函数中引用的未解析的外部符号 _wcstok

IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

函数_main(OPENGL C++)中引用的未解析的外部符号_____________

LNK2019:函数“void __cdecl mainfunc(void)”中引用的未解析外部符号 _kiss_fftr_alloc