У меня сейчас есть проект под названием ЛИЭС с такой структурой:
├── 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. В этом случае следует использовать решение, предоставленное для этот вопрос.
Как отмечено в отчет об ошибке вы ссылаетесь в 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
, который обычно используется для поиска установлены файлы.
Других решений пока нет …