Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有Catch库的未解析外部符号_C++_Unit Testing_Build_Cmake_Catch Unit Test - Fatal编程技术网

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

C++ 带有Catch库的未解析外部符号,c++,unit-testing,build,cmake,catch-unit-test,C++,Unit Testing,Build,Cmake,Catch Unit Test,我正在迁移一些项目以使用构建系统。现在,我正在使用库添加带有一些单元测试的项目。这是一个只有标题的库。旧的VisualStudio项目构建良好,但新项目给出了未解决的外部符号链接器错误。我在一个源文件中定义了CATCH\u CONFIG\u MAIN。添加了测试所需的其他项目的所有cpp文件,并链接了其他测试项目所依赖的所有库。尽管如此,我仍然只有从项目生成的未解决外部符号错误: 显然,我没有从vcxproj添加一些配置到CMakeLists.txt,但我目前无法理解它。从您提供的上下文中推断具

我正在迁移一些项目以使用构建系统。现在,我正在使用库添加带有一些单元测试的项目。这是一个只有标题的库。旧的VisualStudio项目构建良好,但新项目给出了未解决的外部符号链接器错误。我在一个源文件中定义了CATCH\u CONFIG\u MAIN。添加了测试所需的其他项目的所有cpp文件,并链接了其他测试项目所依赖的所有库。尽管如此,我仍然只有从项目生成的未解决外部符号错误:


显然,我没有从vcxproj添加一些配置到
CMakeLists.txt
,但我目前无法理解它。

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


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

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

#define CATCH_CONFIG_MAIN
#include <catch.hpp>
此宏强制在所有文件中包含预编译头,但在其中我有
#include
而没有
#define CATCH_CONFIG_MAIN
,除一个文件外,所有文件都需要它


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

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

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


右键单击project->Configuration Properties->C/C++->Precompiled Header->Precompiled Header->Not Using Precompiled Header.

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

显然,您缺少一些捕获库。如果在VS项目的链接器部分找不到它们;然后尝试在Catch的标题中查找
#pragma comment(lib,“Catch库的名称”)
,这将导致链接器自动拾取命名库。@Richard Criten,正如我所说,Catch库只是标题,没有libs。您是否使用“官方”指令进行CMake集成?(参见CMake部分)您能给出一个包含一些
CMakeLists.txt
code的示例吗?+1感谢您向我指出有关CMake集成的官方捕获文档,但我没有发现任何关于我的问题的有用信息。将Catch定义为接口库并将其添加为目标链接库中的依赖项是毫无意义的,因为Catch是仅头部的库,不需要单独的构建和链接。尽管如此,我还是尝试了它,但这并没有改变任何东西。@bobeff您是否尝试过在新的CMake环境中使用精确的指令从头开始创建一个catch单元测试项目?也许它会帮助你找到确切的问题,因为目前没有足够的信息。从头开始做可能会帮助你找到一个突破的步骤。
add_precompiled_header (${TARGET_NAME}
  ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.h
  ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp)
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)