CMake: сборка и установка локально хранящегося субмодуля - PullRequest
0 голосов
/ 13 марта 2019

Существует множество похожих вопросов о переполнении стека, но ни один из них не подходит для ответа на мой вопрос.

У меня есть библиотека C ++, созданная с использованием CMake:

mylib
| - CMakeLists.txt
| - src/
|   | - m.h
|   | - m.cpp
| - include/
|   | - mylib/
|   |   | - a.h
|   |   | - something/
|   |   |   | - some.h
| - cmake/
|   - mylibConfig.cmake.in
|   - mylibConfigVersion.cmake.in

Затем я создаю другую библиотекуили исполняемый файл, который включает в себя вышеупомянутую библиотеку:

myapp
| - CMakeLists.txt
| - src/
|   | - main.cpp
| - include/
|   | - myapp/
|   |   | - b.h
| - libs
|   | - mylib

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

#include <mylib/a.h>
#include <mylib/something/some.h>

mylib должен быть собран при сборке myapp, чтобы следующее работало без каких-либо других шагов сборки :

$ cd myapp/build
$ cmake ..
$ make

Вот список некоторых сообщений из Переполнения стека, которые я просмотрел.Я пытался каждый, и они просто не работают:

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

При условии, что в описанном проекте только заголовочные файлы в каталоге mylib/include должны считаться общедоступными:

Верхний уровень CMakeLists.txt для mylib должен содержать:

cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(mylib VERSION 0.1 LANGUAGES CXX)

add_library(${MyLibName} ${MyLib_SOURCES})

target_include_directories(${MyLibName}
    PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src
)

Это гарантирует, что проекты, включающие mylib, будут иметь доступ только к файлам в каталоге include/.Файлы в include/ могут использоваться как #include <myfile.h>, а файлы в include/mylib (общее соглашение) могут использоваться как #include <mylib/myfile.h>.

Верхний уровень CMakeLists.txt для myapp должен включать:

cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(myapp VERSION 0.1 LANGUAGES CXX)

add_subdirectory(libs/mylib)

add_executable(${MyAppName} ${MyApp_SOURCES})
target_link_libraries(${MyAppName} ${MyLibName}

Использование add_subdirectory гарантирует, что mylib будет построен до myapp и target_link_libraries добавляет mylib к исполняемому файлу.

Как упомянуто Цалумэномубедитесь, что вы изучили учебники CMake и предпочитаете использовать cmake --build . вместо make.

0 голосов
/ 14 марта 2019

Итак, на самом деле я делаю это в одном из моих проектов.

Во-первых, библиотеку нужно собрать с помощью ADD_LIBRARY (), но я предполагаю, что вы это делаете.Что-то вроде

ADD_LIBRARY (${MyLibName} ${SOURCES}) в библиотеке CMakeLists.txt

, которая добавляет библиотеку в список библиотек cmake.

Во-вторых, вы добавляете библиотеку в свой проект с помощью

target_link_libraries (${PROJECT_NAME} ${MyLibName}) в CMakeLists.txt исполняемого файла, там же, где у вас есть add_executable (${PROJECT_NAME} ${SOURCES})

, который настроит цепочку зависимостей, чтобы MyLibName явно собирался перед PROJECT_NAME.

...