【问题标题】:How to integrate Catch2 as external library with CMake?如何将 Catch2 作为外部库与 CMake 集成?
【发布时间】:2019-01-20 19:00:08
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: c++ cmake catch2


    【解决方案1】:

    首先,由于库是通过 CMake 安装的(同样适用于使用包管理器安装),建议使用 CONFIG 标记 find_package(阅读有关配置模式 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_library,而不是add_executable,虽然没有 由于某种原因,测试在库模式下被识别;然而,这超出了 这个问题的范围,因为它更多地在于使用 pf Catch2 的知识。

    【讨论】:

    • 原始代码中的唯一 问题是缺少对tests 目标的调用。此答案中提到的所有其他内容都与原始问题完全无关,并且对于让 Catch2 与 CMake 一起使用是完全没有必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2011-07-29
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2020-05-13
    相关资源
    最近更新 更多