【问题标题】:Unresolved external symbol with Catch library带有 Catch 库的未解析外部符号
【发布时间】: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 代码?

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


【解决方案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 &lt;catch.hpp&gt; 没有#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)
      

      【讨论】:

        猜你喜欢
        • 2010-10-12
        • 2017-02-07
        • 2014-05-06
        • 2018-08-02
        • 1970-01-01
        • 2014-05-03
        • 2011-02-09
        相关资源
        最近更新 更多