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)

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

4

4 回答 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它是所有文件都需要的,除了一个。

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

于 2017-07-25T09:45:24.023 回答
1

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

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

于 2017-06-21T13:37:12.083 回答
0

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

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

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

于 2018-08-06T06:28:58.740 回答
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)
于 2021-05-09T11:43:22.773 回答