Файлы 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()
,