Как интегрировать Catch2 как внешнюю библиотеку с CMake?

Я пытаюсь настроить учебный проект с использованием Catch2, и я решил, что лучше всего клонировать репозиторий в папку Cpp, чтобы я мог получать обновления и использовать его для других проектов C++. Способ установки такой, как описано здесь.

Основная структура папок:

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

Согласно документации Catch2 я поместил это в мой файл 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, за исключением самых простых команд, которые мне приходилось использовать на работе. Я думаю, что было бы меньше работы, чтобы просто поместить его в файл заголовка, как это и было задумано, но такой подход стал более понятным для меня...

Примечание: я прочитал этот ТАК вопрос. Однако его вопрос касался Catch2 как заголовочного файла внутри проекта.

Примечание 2: желаемым поведением является сборка проекта с использованием Catch2 в качестве внешней библиотеки.

(Дополнительная информация: CMake --version - 3.13.3, с использованием CMakeTools в VS Code, ОС - Windows 10)

1 ответ

Во-первых, поскольку библиотека была установлена ​​через CMake (то же самое относится и к установкам с использованием менеджера пакетов), рекомендуется пометить find_package с CONFIG (о режиме конфигурации читайте здесь). Это связано с тем, что даже если репозиторий Catch2 находится в родительской общей папке проекта, процесс установки 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хотя по какой-либо причине в режиме библиотеки не распознаются никакие тесты; однако это выходит за рамки этого вопроса, так как больше относится к знаниям об использовании Catch2.

Другие вопросы по тегам