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

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

/DEV
 |-- lib1
        | CMakeLists.txt

 |-- lib2
        | CMakeLists.txt

 |-- exe1
        | CMakeLists.txt

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

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

Я бы хотел:

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

Я понятия не имею, с чего начать. Пожалуйста помоги...

2 ответа

Решение

Вам не нужен отдельный 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, а не места установки при связывании целей.

К

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

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

При сборке, каталоги include и lib должны ссылаться на каталог INSTALL

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

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

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

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