Как интегрировать 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 имеет "тесты" в качестве цели. Это решает исходную проблему.
Однако, чтобы он полностью работал, вам нужно выполнить следующие дополнительные шаги:
- использование
catch_discover_tests(tests)
include(CTest)
возможно необходимо.- Команда препроцессора включения должна быть:
#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.