Как интегрировать Catch2 как внешнюю библиотеку с CMake? - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь настроить учебный проект с использованием 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 Ответ

0 голосов
/ 20 января 2019

Во-первых, поскольку библиотека была установлена ​​через 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 должна быть: #include <catch2/catch.hpp> вместо простого #include "catch.hpp".

Кроме того, убедитесь, что ваш редактор знает о переменных среды, созданных во времяустановка Catch2.То есть, если у вас возникли проблемы, перезапустите редактор, чтобы он перечитал переменные окружения.

Full 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, хотя по какой-либо причине в режиме библиотеки не распознаются никакие тесты;однако это выходит за рамки этого вопроса, так как больше относится к знаниям об использовании Catch 2.

...