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



我正在迁移一些项目以使用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添加一些配置,但我目前无法弄清楚。

在我的一个文件中,我有:

#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除了一个文件之外的所有文件都需要的。

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

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

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

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

我仍然在我的项目中使用 stdafx.h,并禁用预编译标头选项以便构建项目。

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

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

最新更新