Для простоты, вот пример того, чего я пытаюсь достичь:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
project(example)
add_library(${PROJECT_NAME} SHARED)
target_link_libraries(${PROJECT_NAME} PUBLIC objc)
set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX)
После сборки я запускаю следующую команду:otool -L libexample.dylib
, которая выводит:
libexample.dylib:
@rpath/libexample.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
Можно ли что-нибудь сделать с помощью CMake, чтобы привязка к библиотеке objc использовала rpath вместо полного пути? @rpath/libobjc.A.dylib
вместо /usr/lib/libobjc.A.dylib
Изменить:
Я попробовал решение для этого вопрос, но, похоже, это не решает мою проблему. Вывод команды otool
остается прежним.
Редактировать 2:
Следующий пример по-прежнему ссылается на полный путь, а не на rpath:
cmake_minimum_required(VERSION 3.9)
project(example)
set(CMAKE_MACOSX_RPATH TRUE)
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_INSTALL_NAME_DIR "@rpath/")
add_library(${PROJECT_NAME} SHARED)
set_target_properties(${PROJECT_NAME} PROPERTIES
LINKER_LANGUAGE CXX
LINK_FLAGS "-Wl,-rpath,./"
MACOSX_RPATH TRUE
SKIP_BUILD_RPATH FALSE
BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH_USE_LINK_PATH TRUE
INSTALL_NAME_DIR "@rpath/")
target_link_libraries(${PROJECT_NAME} PUBLIC objc)
Редактировать 3:
После дальнейших исследований я пришел к выводу, что это было бы невозможно без использования install_name_tool -change
. Из этой проблемы следует, что для любых внешних библиотек (вне дерева сборки ) результирующий путь ссылки будет любым идентификатором библиотеки (используйте: otool -D /usr/lib/libobjc.A.dylib
, чтобы найти идентификатор библиотеки).
install_name_tool -change
, но было бы намного чище, если бы у CMake был способ сделать это на месте. - person martin   schedule 01.05.2018install_name_tool
каждый раз. Какие методы вы пробовали для связанного вопроса/ответа? Кажется, там описано несколько методов. Насколько я понимаю,SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
будет основным переопределением для исключения полного имени пути. - person l'L'l   schedule 01.05.2018SET(CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH already # (but later on when installing)
иSET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
. Вы также можете попробоватьINSTALL_NAME_DIR
иMACOSX_RPATH
... - person l'L'l   schedule 01.05.2018CMAKE_BUILD_WITH_INSTALL_RPATH
наTRUE
, хотя должно бытьFALSE
; то же самое сCMAKE_INSTALL_RPATH_USE_LINK_PATH
. - person l'L'l   schedule 02.05.2018