Как собрать много разных пакетов с помощью CMake

Я пытаюсь собрать проект CMake, в котором у меня есть разные пакеты, которые мне нужно собрать. Это моя желаемая структура:

package1
  src
    file.cpp
  test
    file_test.cpp
package2
  src
    file2.cpp
  test
    file2_test.cpp
CMakeLists.txt
main.cpp // this will be removed later

Это мой текущий файл CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)

# set the project name
project(cppApp)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

include_directories(${PROJECT_SOURCE_DIR})

# add the executable
add_executable(cppApp main.cpp ./package1/src/file.cpp ./package2/src/file2.cpp)

Итак, вопрос в том, во-первых, считается ли библиотека пакетом в CMake? Этот вопрос исходит от человека, который много работал с Java, где я обычно называю это пакетом, а не библиотекой. Но это в CMake?

Кроме того, как мне в CMake включить все файлы в «пакеты», которые будут созданы вместо жесткого кодирования в файлах в качестве исполняемого файла? Если я создам много файлов .cpp/.h, я хочу максимально автоматизировать это.

Я видел, что некоторые другие проекты используют файл CMakeLists.txt внутри каждого «пакета», это идеально? И это хорошая практика?

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

Не могли бы вы подробнее рассказать о термине "упаковка"? Совершенно непонятно, что считать единицей.

πάντα ῥεῖ 09.04.2022 11:59

Пакет в Java — это не библиотека, это способ организовать классы в пространства имен. Это могут быть библиотеки или часть вашего собственного проекта. В С++ вы используете пространства имен для той же цели.

The Dreams Wind 09.04.2022 12:01

Да это я понимаю. Вот почему я хотел уточнить, что такое определение в C++/CMake и как я должен думать в соответствии со своей структурой и как ее построить. В CMake есть что-то под названием add_library(lib), и считаются ли такие каталоги библиотекой? Может ли что-то подтолкнуть меня в правильном направлении или показать какой-то пример, чем это отличается и как добавить это в файл CMake для его сборки?

mj01100011 09.04.2022 12:06

Пакет есть пакет, библиотека есть библиотека; оба не являются синонимами в C++ (и, следовательно, в CMake). Пакет в терминах cmake имеет больше общего, например. Пакеты apt: один пакет может содержать произвольное количество исполняемых файлов, библиотек, заголовочных файлов и т. д. Обратите внимание, что это действительно означает, что библиотека только заголовков может считаться пакетом. Что касается создания пакета в CMake: это можно сделать с помощью cmake --install ..., cpack, которые работают, среди прочего, на основе команды install cmake, но мне кажется, что это не то, чего вы надеетесь достичь прямо сейчас.

fabian 09.04.2022 13:33

вы можете использовать file(GLOB SRC_FILES dir/*.cpp) для автоматизации вывода списка исходных файлов, но есть проблемы с производительностью, которые частично решаются с помощью ключевого слова CONFIGURE_DEPENDS, не говоря уже о том, что вы можете перечислить файлы, которые вам на самом деле не нужны, как часть

Kazz 09.04.2022 14:19
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
5
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

So the question is firstly, is a library considered a package in CMake? This question comes from someone who have done a lot of Java where I would typically call that a package and not a library. But does it in CMake?

Ваше определение пакета в Java не совсем точное. Пакет — это просто средство для организации классов в Java в стиле пространства имен. Это могут быть классы отдельной библиотеки, но ничто не мешает вам использовать разные пакеты в рамках одного проекта. Это не имеет ничего общего с Пакеты CMake, где каждый пакет на самом деле является отдельным проектом.

I have seen that some other projects use a CMakeLists.txt file inside each "package", is this ideal? And is this good practice?

CMakeLists.txt файлы в подкаталогах просто определяют новое подмножество правил для этих каталогов. Чтобы ваш проект CMake соблюдал эти правила, вы добавляете такой каталог с помощью add_subdirectory. Это не обязательно отдельная библиотека, вы можете создать подмножество правил для частей одного проекта, и обычно это хорошая идея, если некоторые файлы действительно сильно отличаются.

CMake have something called add_library(lib) and is those kinds of directories considered a library?

add_library создает так называемую цель CMake, как и add_executable. Цели могут быть связаны друг с другом с помощью target_link_libraries, и это действительно будет считаться библиотекой с точки зрения C++.

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