Как собрать много разных пакетов с помощью 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
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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++.

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