Как включить сторонние инструменты с cmake?

Я работал над проектом CPP, но использовал конфигурацию в Visual Studio IDE. Теперь я хотел использовать генератор системы сборки CMake. Немного сложно начать с этого.

Я пытаюсь добавить сторонний инструмент cppunit для тестирования. Для этого я добавил файл include и lib в папку Third_Party. Но не уверен, как включить его в CMakeLists.txt.

Пожалуйста, найдите CMakeList.txt

# CMake version setting
cmake_minimum_required(VERSION 3.8)
if (${CMAKE_VERSION} VERSION_LESS 3.19)
    cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
else()
    cmake_policy(VERSION 3.19)
endif ()

# Set project name and version
project(myproject
    VERSION 1.0
    DESCRIPTION "Setup cmake build system"
    LANGUAGES CXX
)

# Third party dependencies
set(THIRD_PARTY_DIR "${PROJECT_SOURCE_DIR}/third_party")

# CPP unit
set(CPP_UNIT_LIB_NAME "cppunit")
set(CPP_UNIT_VERSION "1.13.2")
set(CPP_UNIT_DIR "${THIRD_PARTY_DIR}/${CPP_UNIT_LIB_NAME}/${CPP_UNIT_VERSION}")

# NOT sure what to do here
# add_subdirectory(${CPP_UNIT_DIR})
# target_include_directories(${PROJECT_NAME} PRIVATE "${CPP_UNIT_DIR}/include/cppunit")
# target_link_libraries(${PROJECT_NAME}  ${CPP_UNIT_LIB_NAME} ${CPP_UNIT_LIBRARIES})
# target_compile_definitions(${PROJECT_NAME}  PRIVATE "CPP_UNIT_INCLUDE_NONE")

add_subdirectory(src)

Пожалуйста, найдите снимок структуры папок

Я также читал, что мы не должны использовать файл (GLOB), include_directories, link_directories и т. д. в проектах.

Avi 25.12.2020 19:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 278
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

add_subdirectory(${CPP_UNIT_DIR}) будет искать в каталоге, указанном для CMakeLists.txt, и, поскольку CppUnit имеет файл CMakeLists.txt (https://github.com/Ultimaker/CppUnit/blob/master/CMakeLists.txt), он создаст библиотеку указан add_library(cppunit STATIC ${Sources}), который является cppunit.

А затем, когда вы укажете цель для сборки, вы можете связать ее в cppunit с помощью target_link_libraries(your_target cppunit). Но вам нужно создать свою цель, например, используя add_executable(one two.cpp three.h), которая создает цель one.

https://cliutils.gitlab.io/modern-cmake/ — хороший вводный ресурс по CMake. И есть разные способы привлечения внешних проектов, например, через подмодуль git.

Если у вас есть файл CMakeLists.txt в подкаталоге src, где вы создаете цель, вы можете связать ее в cppunit.

Что касается комментария о include_directories, обычно считается хорошей практикой использовать вместо него target_include_directories, см. В чем разница между include_directories и target_include_directories в CMake? и указанный выше ресурс для получения дополнительной информации.

Спасибо, @ОРР. Это действительно полезно. Еще один вопрос здесь. Если у меня есть несколько сторонних инструментов, которые имеют только файлы заголовков и не имеют их CMakeLists.txt. И, если я не хочу хранить исходные файлы cppunit в каталоге моего проекта. Как связать цель моего проекта? Если бы вы могли поделиться правильной ссылкой для этой конкретной темы. Это также было бы полезно.

Avi 25.12.2020 21:44

@Avi всегда пожалуйста. Вы можете создать INTERFACE цель библиотеки для файлов только заголовков, см. mariobadr.com/creating-a-header-only-library-with-cmake.html ‌​. Если вы используете git, то добавление вашего внешнего проекта в качестве подмодуля git будет означать, что git должен отслеживать только те внешние проекты, которые вы используете, поэтому вы не будете удерживать исходный код, но исходный код будет извлечен при сборке проекта, например. git submodule add iscinumpy.gitlab.io/post/gtest-submodule cliutils.gitlab.io/modern-cmake/chapters/projects/… а потом как делали до вызова add_subdirectory(submodule_name)

0RR 25.12.2020 22:59

@Avi добавит подмодуль во время сборки, и ваша папка src не должна содержать никаких помех, потому что ваш внешний проект будет назван в файле gitmodules. Или вы можете попробовать использовать ExternalProject_add, например. stackoverflow.com/questions/15175318/… И если вы обнаружите, что ваша сборка загромождена различными целями, например. в Visual Studio вы можете настроить set_property( GLOBAL PROPERTY USE_FOLDERS ON) на использование структуры папок и размещение определенных целей в определенных папках.

0RR 25.12.2020 23:02

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