Основному приложению необходимо собрать эти библиотеки в других папках и установить их в выходную папку, а затем основному приложению необходимо создать ссылку на библиотеки для создания исполняемого файла.
Нет необходимости в CMake установить библиотеки для того, чтобы ссылаться на них. Вы можете создавать библиотеки и иметь основную исполняемую ссылку на них без установки библиотек. Когда вам нужно установить приложение целиком, вы можете установить библиотеки вместе с исполняемым файлом, если это необходимо, т.е. если библиотеки являются общими, а не stati c.
Один пример того, как вы можете организовать вещи : предположим, у вас есть следующая структура в вашем проекте:
CMakeLists.txt # root of project
|
|--lib
| |--CMakeLists.txt # library subproject
|
|--app
|--CMakeLists.txt # app subproject
Тогда ваш root CMakeLists.txt
может выглядеть так:
project(MyProject)
add_subdirectory(lib)
add_subdirectory(app)
Может выглядеть CMakeLists.txt подпроекта lib. например:
project(MyLib)
set(SOURCES <...>) # specify library's sources
add_library(${PROJECT_NAME} ${SOURCES})
set(MyLib ${PROJECT_NAME} CACHE INTERNAL "")
Последняя строка в приведенном выше фрагменте кода предназначена для того, чтобы переменная MyLib
была доступна везде в рамках проекта. Я нашел этот трюк здесь и успешно использовал его в своих проектах. Может быть, есть лучшие варианты здесь, если кто-то знает их, не стесняйтесь предложить.
Приложение CMakeLists.txt
может тогда выглядеть так:
project(MyApp)
set(SOURCES <...>) # specify app's sources
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} ${MyLib})
Я не охватил установку здесь, но на самом деле все просто: если ваши библиотеки stati c, вам нужно только установить исполняемый файл, используя install TARGETS . Если ваши библиотеки являются общими, вам необходимо установить их вместе с исполняемым файлом.