Я пытаюсь собрать проект 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 внутри каждого «пакета», это идеально? И это хорошая практика?
Если у вас есть лучшее предложение в соответствии с каким-то стандартом, который я должен использовать для структурирования своего проекта, я также хотел бы узнать хороший.
Пакет в Java — это не библиотека, это способ организовать классы в пространства имен. Это могут быть библиотеки или часть вашего собственного проекта. В С++ вы используете пространства имен для той же цели.
Да это я понимаю. Вот почему я хотел уточнить, что такое определение в C++/CMake и как я должен думать в соответствии со своей структурой и как ее построить. В CMake есть что-то под названием add_library(lib)
, и считаются ли такие каталоги библиотекой? Может ли что-то подтолкнуть меня в правильном направлении или показать какой-то пример, чем это отличается и как добавить это в файл CMake для его сборки?
Пакет есть пакет, библиотека есть библиотека; оба не являются синонимами в C++ (и, следовательно, в CMake). Пакет в терминах cmake имеет больше общего, например. Пакеты apt: один пакет может содержать произвольное количество исполняемых файлов, библиотек, заголовочных файлов и т. д. Обратите внимание, что это действительно означает, что библиотека только заголовков может считаться пакетом. Что касается создания пакета в CMake: это можно сделать с помощью cmake --install ...
, cpack
, которые работают, среди прочего, на основе команды install
cmake, но мне кажется, что это не то, чего вы надеетесь достичь прямо сейчас.
вы можете использовать file(GLOB SRC_FILES dir/*.cpp)
для автоматизации вывода списка исходных файлов, но есть проблемы с производительностью, которые частично решаются с помощью ключевого слова CONFIGURE_DEPENDS
, не говоря уже о том, что вы можете перечислить файлы, которые вам на самом деле не нужны, как часть
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++.
Не могли бы вы подробнее рассказать о термине "упаковка"? Совершенно непонятно, что считать единицей.