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

时间:2017-06-21 13:22:16

标签: c++ unit-testing build cmake catch-unit-test

我正在迁移一些项目以使用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 个答案:

答案 0 :(得分:2)

在我的一个档案中:

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

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

#include <catch.hpp>

此宏在所有文件中强制包含预编译的标头,但在其中我#define CATCH_CONFIG_MAIN没有{{1}},除了一个文件外,所有文件都需要{{1}}。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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)