CMake использует rpath для связанных библиотек вместо полного пути

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

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, чтобы найти идентификатор библиотеки).


person martin    schedule 01.05.2018    source источник
comment
См. этот ответ: stackoverflow.com/a/43333118/499581   -  person l'L'l    schedule 01.05.2018
comment
Пробовал решение в этом вопросе, но когда я проверяю dylib, результат тот же. В качестве обходного пути я мог бы использовать install_name_tool -change, но было бы намного чище, если бы у CMake был способ сделать это на месте.   -  person martin    schedule 01.05.2018
comment
Я полностью согласен, что это будет чище, чем использовать install_name_tool каждый раз. Какие методы вы пробовали для связанного вопроса/ответа? Кажется, там описано несколько методов. Насколько я понимаю, SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) будет основным переопределением для исключения полного имени пути.   -  person l'L'l    schedule 01.05.2018
comment
Я пробовал довольно много комбинаций из этого ответа, а также из этой ссылки: gitlab.kitware.com/cmake/community/wikis/doc/cmake/, но все равно не повезло. Я полагаю, что следует отметить, что я ищу, чтобы это работало после этапа сборки (а не установки).   -  person martin    schedule 01.05.2018
comment
Поскольку вы хотите это для этапа сборки, вам следует использовать SET(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.2018
comment
Ключевой раздел документации, на который, я думаю, вам стоит обратить внимание, называется Настройки RPATH по умолчанию.   -  person l'L'l    schedule 01.05.2018
comment
Да, я согласен с тем, что документация решает эту проблему, но описанное там исправление, судя по моему опыту, не работает. Я исправил вопрос дополнительным нерабочим примером.   -  person martin    schedule 02.05.2018
comment
Вы установили CMAKE_BUILD_WITH_INSTALL_RPATH на TRUE, хотя должно быть FALSE; то же самое с CMAKE_INSTALL_RPATH_USE_LINK_PATH.   -  person l'L'l    schedule 02.05.2018
comment
Давайте продолжим обсуждение в чате.   -  person martin    schedule 02.05.2018