Я работал над проектом 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)
Пожалуйста, найдите снимок структуры папок
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 всегда пожалуйста. Вы можете создать 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)
@Avi добавит подмодуль во время сборки, и ваша папка src не должна содержать никаких помех, потому что ваш внешний проект будет назван в файле gitmodules. Или вы можете попробовать использовать ExternalProject_add
, например. stackoverflow.com/questions/15175318/… И если вы обнаружите, что ваша сборка загромождена различными целями, например. в Visual Studio вы можете настроить set_property( GLOBAL PROPERTY USE_FOLDERS ON)
на использование структуры папок и размещение определенных целей в определенных папках.
Я также читал, что мы не должны использовать файл (GLOB), include_directories, link_directories и т. д. в проектах.