Запустите команду make install в cmake из другого файла cmake - PullRequest
0 голосов
/ 16 января 2020

У нас есть несколько библиотек в разных папках. Основное приложение должно собрать эти библиотеки в других папках и установить их в выходную папку, а затем главное приложение должно связаться с библиотеками для сборки исполняемого файла.

Я Я могу собрать библиотеки, присутствующие в других папках, используя add_subdirectory () в al oop, но я не могу установить их в выходную папку с помощью основного файла cmake. Может ли кто-нибудь помочь мне в этом.

1 Ответ

0 голосов
/ 17 января 2020

Основному приложению необходимо собрать эти библиотеки в других папках и установить их в выходную папку, а затем основному приложению необходимо создать ссылку на библиотеки для создания исполняемого файла.

Нет необходимости в 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 . Если ваши библиотеки являются общими, вам необходимо установить их вместе с исполняемым файлом.

...