Я пытаюсь использовать 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 есть возможность сделать это для меня легко и элегантно.
Большое спасибо
Сэм
Да, вы должны использовать 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} ...)