Как CMake узнает, какие префиксы и суффиксы добавить в общие библиотеки?

Я пытаюсь использовать INSTALL в CMake для копирования некоторых внешних двоичных файлов в каталог установки. Мой код выглядит так:

SET(SimTK_SHARED_LIBS
SimTKsimbody
SimTKmath
SimTKcommon
SimTKmolmodel
)

INSTALL(TARGETS ${SimTK_SHARED_LIBS}
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
)

Я получаю эту ошибку:

CMake Ошибка в CMakeLists.txt: 216 (УСТАНОВИТЬ):
установить TARGETS заданную цель «SimTKsimbody», которая не существует в этом
каталог.

это несмотря на то, что файлы называются как libSimTKsimbody.so и (неправильно) SimTKsimbody в текущем каталоге, а также в каталоге библиотеки.

Интересно, что это:

SET(SHARED_MMB_TARGET MMBlib)
ADD_LIBRARY(${SHARED_MMB_TARGET} SHARED
${MMB_LIBRARY_SOURCE_FILES}
${MMB_HEADER_FILES})
SET_TARGET_PROPERTIES(${SHARED_MMB_TARGET}
PROPERTIES
COMPILE_FLAGS "-DMMB_BUILDING_SHARED_LIBRARY"PROJECT_LABEL "MMBlib (dynamic)")
TARGET_LINK_LIBRARIES(${SHARED_MMB_TARGET}
${SimTK_SHARED_LIBS_D}
${SimTK_SHARED_LIBS}
${OpenMM_SHARED_LIBS_D}
${OpenMM_SHARED_LIBS}
${SimTK_GENERAL_LIBS})

INSTALL(TARGETS ${SHARED_MMB_TARGET}
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)

.. работает отлично. Устанавливает libMMBlib.so в ${CMAKE_INSTALL_PREFIX}/lib как это должно. Означает ли это, что INSTALL будет работать только для этого, если я выпущу ADD_LIBRARY и / или SET_TARGET_PROPERTIES? SimTK_SHARED_LIBS скомпилированы отдельно, я действительно не хочу их здесь компилировать.

Я думал об использовании INSTALL FILES и просто о написании кода для обработки имен библиотек для каждой операционной системы. Однако я убежден, что у CMake есть возможность сделать это для меня легко и элегантно.

Большое спасибо

Сэм

0

Решение

Да, вы должны использовать INSTALL (ФАЙЛЫ) для установки файлов внешних библиотек.

CMake использует CMAKE_SHARED_LIBRARY_PREFIX а также CMAKE_SHARED_LIBRARY_SUFFIX в качестве префикса и суффикса по умолчанию для библиотек, созданных с add_library(... SHARED), так что вы можете ожидать, что эти компоненты из внешней библиотеки:

INSTALL(FILES /path/to/library/${CMAKE_SHARED_LIBRARY_PREFIX}SimTKsimbody${CMAKE_SHARED_LIBRARY_SUFFIX}
...)

Также вы можете использовать FIND_LIBRARY для автоматической (и приятной) проверки ваших ожиданий относительно суффикса и префикса библиотеки:

FIND_LIBRARY(SIMTK_SIMBODY_LIB
${CMAKE_SHARED_LIBRARY_PREFIX}SimTKsimbody${CMAKE_SHARED_LIBRARY_SUFFIX}
PATH /path/to/library)

INSTALL(FILES ${SIMTK_SIMBODY_LIB} ...)
2

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


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