带有 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 <catch.hpp>
没有#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 库的未解析外部符号的主要内容,如果未能解决你的问题,请参考以下文章
IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API
C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号
函数_main(OPENGL C++)中引用的未解析的外部符号_____________
LNK2019:函数“void __cdecl mainfunc(void)”中引用的未解析外部符号 _kiss_fftr_alloc