gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:56 25 4
gpt4 key购买 nike

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

最佳答案

首先,由于库是通过 CMake 安装的(同样适用于使用包管理器安装),建议标记 find_packageCONFIG (阅读配置模式 here )。这是因为即使 Catch2 存储库位于项目的父公共(public)文件夹中,CMake 安装过程也会将其安装在 Program Files 文件夹中(在 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:

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

关于c++ - 如何将 Catch2 作为外部库与 CMake 集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com