Компиляция динамической библиотеки в MacOS с путем поиска библиотеки, указывающим на тот же каталог (CMake)

Я пытаюсь скомпилировать dylib на MacOS с помощью CMake. Моя библиотека динамически связана с некоторыми другими библиотеками, и я хочу отправить их вместе со своей библиотекой. Для этого мне нужно убедиться, что когда я загружаю свою библиотеку, зависимые библиотеки загружаются из одной и той же папки независимо от ее местоположения. Я считаю, что это как-то связано с rpath, но я здесь не эксперт. Не могли бы вы предложить способ добиться этого с помощью CMake? (Думаю, нужно указать некоторые параметры компоновщика через -Wl,-rpath или аналогичные

Заранее спасибо!


person Vyacheslav    schedule 11.04.2015    source источник


Ответы (2)


Вот что я сделал в своих сценариях CMake для загрузки общих библиотек из того же каталога, что и мои двоичные файлы (исполняемые файлы и другие библиотеки):

SET(CMAKE_BUILD_WITH_INSTALL_RPATH true)
SET(CMAKE_INSTALL_RPATH "$ORIGIN/")

(проверено с помощью CMake 3.0+)

Как это работает (насколько я понимаю): вторая строка указывает CMake добавить специальную строку $ORIGIN в папку поиска двоичных файлов (эта специальная строка $ORIGIN «заменяется» ОС во время выполнения папкой, содержащей исполняемый двоичный файл). .Таким образом, нужная библиотека, которая находится рядом с бинарником, содержащим эту строку, будет найдена корректно).

Однако установка этой переменной в CMake влияет только на двоичные файлы установки (например, те, которые развернуты с помощью make install): CMake не меняет путь поиска в двоичных файлах. создаются на этапе сборки, а только при их установке.

Поскольку я не использую функцию установки CMake, а хочу предоставить свое приложение только в свободно перемещаемой папке, я использовал первый вызов, который указывает CMake использовать пути поиска во время установки и во время сборки.

Итак, с помощью этих двух вызовов вызов make (или сборка с помощью XCode, я полагаю) для make-файлов, сгенерированных CMake, создаст двоичные файлы с правильно установленной папкой поиска $ORIGIN.

Пожалуйста, сделайте это перед определением любой другой цели. Вы также можете настроить эти параметры для отдельных целей, используя set_target_property со свойствами BUILD_WITH_INSTALL_RPATH и INSTALL_RPATH.

Я тестировал это только под Linux, но если MacOS X ведет себя так же, все должно быть в порядке.

Надеюсь это поможет

Бенджамин

person Benjamin Golinvaux    schedule 01.12.2015

Трюк Linux ${ORIGIN} не сработает. В macOS зависимости библиотек по умолчанию указываются как абсолютный путь (otool -L mylib.dylib).

Чтобы иметь относительный путь (например, ту же папку), я думаю, что правильный способ - изменить имена установки зависимых библиотек внутри вашей основной библиотеки (с install_name_tool -change ...) на что-то вроде @rpath/other.dylib с исправьте rpath в исполняемом файле (dylib) или в вашем случае просто @executable_path/other.dylib.

Что касается CMake, я успешно использовал модуль CMake BundleUtilities, чтобы исправить это. автоматически, возможно, стоит попробовать.

person rma    schedule 07.07.2016