Cmake: экспорт целей подпроекта в основной проект

У меня сейчас есть проект под названием ЛИЭС с такой структурой:

├── Lib1
│   ├── CMakeLists.txt
│   ├── lib1-class.cpp
│   └── lib1-class.h
├── lib2
│   └── CMakeLists.txt
│   ├── lib2-class.cpp
│   ├── lib2-class.h
├── cmake
│   └── LIBSConfig.cmake.in
├── CMakeLists.txt

в главном файле cmake у меня есть:

install(
TARGETS
lib1
lib2
DESTINATION
${PROJECT_DIRNAME_lib}
EXPORT
${PROJECT_NAME}Exports
)

install(
EXPORT
${PROJECT_NAME}Exports
DESTINATION
${PROJECT_DIRNAME_lib}
)

как я хочу экспортировать их в пакет, который можно обнаружить с помощью find_package ().

Моя проблема в том, что я генерирую lib1 а также lib2 в соответствующих каталогах и при их установке Cmake сообщает мне, что

Error:install TARGETS given target "lib1" which does not exist in this directory.

Как предложено Вот, Я понимаю, что я должен использовать Export() а в lib1 и lib2 есть что-то вроде:

export(TARGETS lib1 FILE lib1Exports.cmake)

и в ЛИЭС проект, есть что-то вроде этого:

ADD_LIBRARY(lib1 UNKNOWN IMPORTED)
set_property(TARGET lib1 PROPERTY IMPORTED_LOCATION lib1)

Однако мне не нравится использовать то же имя для этой библиотеки, которое добавляется из родительского проекта. Это говорит мне:

Error:add_library cannot create imported target "lib1" because another target with the same name already exists.

поэтому библиотека доступна, и я могу ссылаться на нее и т. д., если мне нужно создать еще одну цель в родительском каталоге, но я не могу ее установить.

Я нашел точно такую ​​же проблему в отчете об ошибке Вот но я считаю, что cmake теперь работает по-другому, и я просто делаю это неправильно.
Так я делаю это неправильно? Я хотел бы избежать использования внешних пакетов, если это возможно.

Обновить: принятое решение работает только для случаев, когда нет зависимости между lib1, lib2. В этом случае следует использовать решение, предоставленное для этот вопрос.

4

Решение

Как отмечено в отчет об ошибке вы ссылаетесь в install() Команда должна быть запущена из той же директории, где создана цель. Поскольку у вас есть целевые библиотеки, созданные в разных каталогах, вам нужно назначить им разные имена экспорта и, следовательно, разные файлы экспорта.

Но вы можете включить оба файла экспорта в LIBSConfig.cmake сценарий:

CMake / LIBSConfig.cmake:

get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
include(${SELF_DIR}/LIBS-lib1.cmake)
include(${SELF_DIR}/LIBS-lib2.cmake)

lib1 / CMakeLists.txt:

add_library(lib1 ...)
install(TARGET lib1 EXPORT lib1-export ...)

lib2 / CMakeLists.txt:

add_library(lib2 ...)
install(TARGET lib2 EXPORT lib2-export ...)

CMakeLists.txt:

add_subdirectory(lib1)
add_subdirectory(lib2)

install(EXPORT lib1-export FILENAME LIBS-lib1.cmake DESTINATION lib/LIBS)
install(EXPORT lib2-export FILENAME LIBS-lib2.cmake DESTINATION lib/LIBS)
install(FILES cmake/LIBSConfig.cmake DESTINATION lib/LIBS)

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]