CMake использует rpath для связанных библиотек вместо полного пути - PullRequest
0 голосов
/ 01 мая 2018

Для простоты вот пример того, чего я пытаюсь достичь:

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

Edit:
Я попытался решить этот вопрос , но, похоже, это не решает мою проблему. Вывод команды 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, чтобы найти идентификатор библиотеки) .

...