使用Catch库出现未解决的外部符号错误

4

我正在将一些项目迁移到使用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)

显然我错过了从 vcxprojCMakeLists.txt 的一些配置,但目前我无法弄清楚。

你显然缺少一些Catch库。如果在VS项目的链接器部分找不到它们,则尝试查看Catch头文件中的#pragma comment( lib, "name-of-catch-library" ),这将导致链接器自动选择命名的库。 - Richard Critten
2
@Richard Critten正如我所说,catch库仅包含头文件,没有libs - bobeff
2
你是否使用了CMake集成的“官方”指令?https://github.com/philsquared/Catch/blob/master/docs/build-systems.md(请参见CMake部分) - k.v.
2
请问您能否提供一个 [mcve],其中包括一些 CMakeLists.txt 代码? - Florian
4个回答

3

我的文件中有这样一段内容:

#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。除了一个文件外,其他所有文件都需要这个定义。

我添加了宏选项,可以传递一个列表来指定不需要包含预编译头文件的文件,这解决了问题。


1

根据您提供的上下文,很难推断出具体的问题,但这里是CMake集成的官方Catch指南。

在我使用Visual Studio时,集成非常顺利。


+1 感谢您指引我查看关于 CMake 集成的官方 Catch 文档,但是我并没有在那里找到任何有用的关于我的问题的信息。将 Catch 定义为接口库并将其添加为 target_link_libraries 的依赖项是无意义的,因为 Catch 是一个仅包含头文件的库,不需要单独的构建和链接。尽管如此,我还是尝试了这个方法,但是这并没有改变任何东西。 - bobeff
@bobeff,你是否尝试使用精确的指令从头开始在新的CMake环境中创建一个捕获单元测试项目?也许这会帮助你找到确切的问题,因为目前信息不足。从头开始做可能有助于你找到它出错的步骤。 - k.v.

0

当我尝试在测试项目中启用预编译头选项并使用Catch时,会出现链接器错误LNK2019。

为了使项目能够构建,我仍然在我的项目中使用stdafx.h并禁用预编译头选项。

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


0

我也遇到了同样的错误,但是通过将目标链接到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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接