Файлы 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; (это хорошая идея?)
- При создании, добавлении зависимостей к другой библиотеке и их перестройке, если они не обновлены.
У меня нет подсказки, с чего начать. Пожалуйста, помогите...
Ответы
Ответ 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()
.