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

时间:2019-01-20 19:00:08

标签: c++ cmake catch2

我正在尝试使用Catch2建立一个学习项目,我认为这是 最好将存储库克隆到Cpp文件夹中,这样我就可以获取更新并使用它 用于其他C ++项目。安装方法如here所述。

基本文件夹结构为:

Cpp
├───TestProject
│   ├───main.cpp
│   ├───.vscode
│   └───build
│       ├───CMakeFiles
│       └───Testing
└───Catch2
   ├─── ...
  ...

根据Catch2 documentation,我将其放在CMake文件中:

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

但是,当我尝试在VS Code中配置项目时,出现以下错误消息:

[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 World文件,完整的CMakeLists.txt文件内容为:

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的新手,非常感谢 我必须在工作中使用的基本命令。我想丢掉它会减少工作量 像预期的那样将其作为头文件,但是这种方法对 我...

注意:我已阅读this SO question。但是他的问题与 Catch2作为项目内的头文件。

注2:所需的行为是使用Catch2作为外部项目来构建项目 库。

(其他信息:CMake --version为3.13.3,使用VS Code中的CMakeTools, 操作系统是Windows 10)

1 个答案:

答案 0 :(得分:0)

首先,由于该库是通过CMake安装的(对于使用软件包管理器的安装同样适用),建议将find_package标记为CONFIG(了解配置模式here )。 这是因为即使Catch2存储库位于项目的父公共文件夹中,CMake安装过程也会将其安装在Program Files文件夹中(在Windows中);即存储库就是这样。

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

但是,要使其完全起作用,您需要执行以下附加步骤:

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

此外,请确保您的编辑器了解创建的环境变量 在安装Catch2的过程中。也就是说,如果遇到问题,请重新启动 编辑器,以便它重新读取环境变量。

完整的CMakeLists.txt:

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的知识。