Подтвердить что ты не робот

Файлы CMakeLists.txt для нескольких библиотек и исполняемых файлов

Я только начинаю играть с CMake. У меня есть что-то вроде:

/DEV
 |-- lib1
        | CMakeLists.txt

 |-- lib2
        | CMakeLists.txt

 |-- exe1
        | CMakeLists.txt

/BUILD
 |-- lib1
 |-- lib2
 |-- exe1

/INSTALL
 |-- include
 |-- lib
 |-- bin

Я хотел бы:

  • Постройте каждую lib и exe самостоятельно, когда это необходимо. (Поэтому я полагаю, что я должен добавить файл CMakeLists.txt для каждого lib и exe);
  • При создании, включении и каталогах lib следует ссылаться на каталог INSTALL; (это хорошая идея?)
  • При создании, добавлении зависимостей к другой библиотеке и их перестройке, если они не обновлены.

У меня нет подсказки, с чего начать. Пожалуйста, помогите...

4b9b3361

Ответ 1

Вам не нужен отдельный CMakeLists.txt для самостоятельной сборки целей. Скажем, у вас есть один верхний уровень CMakeLists.txt с:

ADD_LIBRARY(lib1 ${all_lib1_files})
ADD_LIBRARY(lib2 ${all_lib2_files})
ADD_EXECUTABLE(exe1 ${all_exe1_files})
TARGET_LINK_LIBRARIES(lib2 lib1)  # lib2 now depends on lib1
TARGET_LINK_LIBRARIES(exe1 lib2)  # exe1 now depends on lib2 and lib1

Затем вы можете создать просто lib1, запустив make lib1 или msbuild lib1.vcxproj и т.д. Вы можете добиться того же, имея отдельные файлы CMakeLists.txt для каждой цели - это зависит от вас, если вы считаете, что это того стоит.

Если ваш проект импортирует эти цели с помощью FIND_LIBRARY или FIND_PACKAGE, то они не будут перестроены, если они не обновлены. В конечном счете, если вы хотите, чтобы устаревшие зависимости были автоматически перестроены, вы должны сообщить CMake об источниках и правилах для зависимой цели, то есть файл CMakeLists.txt должен добавить цель с помощью ADD_LIBRARY или ADD_EXECUTABLE.

Вам не следует тогда ссылаться на каталог INSTALL (за исключением команд INSTALL, которые я себе представляю), поскольку CMake будет неявно использовать места сборки libs/exes, а не установленные местоположения при связывании целей.

Ответ 2

Для

Постройте каждый lib и exe независимо, когда это необходимо.

просто добавьте ключевое слово EXCLUDE_FROM_ALL в вызовы add_executable() или add_library().

При создании, включении и каталях lib следует ссылаться на INSTALL Каталог

Если по referencing вы хотите добавить его к include_directories() и link_directories(), тогда это не приятно. Лучше не утверждать о расположении необходимых файлов в пользовательской системе. Правильный способ заключается в поиске необходимых включений и библиотек с использованием find_package(), find_library() или find_file(). Если вы хотите использовать первую функцию, вам нужно написать FindYourLib.cmake и установить ее по самой библиотеке.

При создании, добавлении зависимостей к другой библиотеке и их восстановлении, если нет обновленный

Это делается автоматически с помощью CMake. Зависимости могут быть добавлены с помощью функции add_dependencies() или неявно с помощью target_link_libraries().