首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Catch2作为外部库与CMake集成?

如何将Catch2作为外部库与CMake集成?
EN

Stack Overflow用户
提问于 2019-01-20 19:00:08
回答 1查看 4K关注 0票数 2

我正在尝试使用Catch2建立一个学习项目,我决定最好将存储库克隆到Cpp文件夹中,这样我就可以获得更新并将其用于其他C++项目。安装方法与描述的这里相同。

基本文件夹结构是:

代码语言:javascript
复制
Cpp
├───TestProject
│   ├───main.cpp
│   ├───.vscode
│   └───build
│       ├───CMakeFiles
│       └───Testing
└───Catch2
   ├─── ...
  ...

根据Catch2文档,我把它放在我的CMake文件中:

代码语言:javascript
复制
find_package(Catch2 REQUIRED)
target_link_libraries(tests Catch2::Catch2)

但是,当我试图在VS代码中配置项目时,我会得到以下错误消息:

代码语言:javascript
复制
[cmake] CMake Error at CMakeLists.txt:5 (target_link_libraries):
[cmake]   Cannot specify link libraries for target "tests" which is not built by this
[cmake]   project.

main.cpp只是一个Hello文件,完整的CMakeLists.txt文件内容如下:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.0.0)
project(TestProject VERSION 0.1.0)

find_package(Catch2 REQUIRED)
target_link_libraries(tests Catch2::Catch2)
enable_testing()

add_library(TestProject TestProject.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

我不知道为什么会这样。我是CMake的新手,除了我在工作中必须使用的非常基本的命令。我想把它作为一个头文件,就像它想要的那样,这样的工作会更少,但是这种方法对我来说更有意义……

注:我读过这个问题。然而,他的问题与Catch2作为项目中的头文件有关。

注2:期望的行为是使用Catch2作为外部库构建项目。

(附加信息: CMake --版本为3.13.3,在VS代码中使用CMakeTools,操作系统为Windows 10)

EN

回答 1

Stack Overflow用户

发布于 2019-01-20 19:00:08

首先,由于库是通过CMake安装的(对于使用包管理器进行安装也是如此),因此建议使用CONFIG标记find_package (阅读Config模式这里)。这是因为即使Catch2存储库位于项目的父文件夹中,CMake安装过程也会将其安装到您的Program文件夹中(在Windows中);也就是说,存储库就是这样。

此外,您还应该使用add_executable(tests main.cpp),以便CMake将“测试”作为目标。这解决了原来的问题。

但是,要使它完全工作,您需要遵循以下附加步骤:

  1. 使用catch_discover_tests(tests)
  2. include(CTest)可能是必要的。
  3. 包含预处理器命令应该是:#include <catch2/catch.hpp>,而不是简单的#include "catch.hpp"

此外,确保编辑器知道在安装Catch2期间创建的环境变量。也就是说,如果您有问题,重新启动编辑器,以便它重新读取环境变量。

完整的CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.5.0)
project(TestProject LANGUAGES CXX VERSION 0.1.0)

find_package(Catch2 REQUIRED)
add_executable(tests main.cpp) # solution to the original problem
target_link_libraries(tests Catch2::Catch2)

include(CTest) # not sure if this is 100% necessary
include(Catch)
catch_discover_tests(tests)
enable_testing()

注意:我们应该使用add_executable而不是add_library,尽管在库模式中由于某种原因没有识别测试;但是这超出了这个问题的范围,因为它更多地在于使用pf Catch2的知识。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54279898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档