Я пытаюсь скомпилировать Dylib на MacOS, используя CMake. Моя библиотека динамически связана с некоторыми другими библиотеками, и я хочу отправить их вместе с моей библиотекой. Для этого мне нужно убедиться, что при загрузке моей библиотеки зависимые библиотеки загружаются из одной и той же папки независимо от ее расположения. Я считаю, что это как-то связано с rpath, но я здесь не эксперт. Можете ли вы предложить способ добиться этого с помощью CMake? (Я предполагаю, что нужно предоставить некоторые опции компоновщика через -Wl, -rpath или подобное
Заранее спасибо!
Вот что я сделал в своих скриптах CMake для загрузки разделяемых библиотек из того же каталога, что и мои двоичные файлы (исполняемые файлы и другие библиотеки):
SET(CMAKE_BUILD_WITH_INSTALL_RPATH true)
SET(CMAKE_INSTALL_RPATH "$ORIGIN/")
(протестировано с CMake 3.0+)
Как это работает (мое понимание): вторая строка говорит CMake добавить специальную строку $ ORIGIN в папку поиска двоичных файлов (Эта специальная строка $ ORIGIN «заменяется» ОС во время выполнения на папку, содержащую исполняемый двоичный файл Таким образом, необходимая библиотека, которая находится рядом с двоичным файлом, содержащим эту строку, будет найдена правильно).
Однако установка этой переменной в CMake влияет только на время его установки двоичные файлы (те, которые развернуты с сделать установку, например): CMake не изменяет путь поиска в двоичных файлах, созданных на этапе сборки, а только при их установке.
Поскольку я не использую функцию установки CMake, и я хочу предоставить свое приложение только в свободно перемещаемой папке, я использовал первый вызов, который сообщает CMake, что во время сборки также нужно использовать пути поиска во время установки.
Итак, с этими двумя звонками делать (или сборка с XCode, я полагаю) на сгенерированных CMake make-файлах создаст двоичные файлы с папкой поиска, правильно установленной в $ ORIGIN.
Пожалуйста, сделайте это до определения любой другой цели. Вы также можете настроить эти параметры для отдельных целей, используя set_target_property со свойствами BUILD_WITH_INSTALL_RPATH и INSTALL_RPATH.
Я только проверял это под Linux, но если MacOS X ведет себя таким же образом, это должно быть в порядке.
Надеюсь это поможет
Вениамин
Трюк с Linux $ {ORIGIN} не сработает. В macOS зависимости библиотек по умолчанию указываются как абсолютный путь ( otool -L mylib.dylib
).
Чтобы иметь относительный путь (например, та же папка), я думаю, что правильный путь — это изменить установочные имена зависимых библиотек внутри вашей основной библиотеки (с помощью install_name_tool -change ...
) что-то вроде @ RPATH / other.dylib с правильным rpath в исполняемом файле (dylib) или в вашем случае просто @ Executable_path / other.dylib.
Что касается CMake, я успешно использовал CMake BundleUtilities Модуль, чтобы исправить это автоматически, возможно, стоит попробовать.