Пакетирование файлов .dylib с монофоническим исполняемым файлом
У меня есть приложение, и я хотел бы связать вместе с ним конкретный dylib. Я использую "dylibbundler", чтобы скопировать dylib вместе с зависимостями в исполняемую папку. Вот команда, которую я использую:
dylibbundler -od -b -x /opt/local/lib/libil.dylib -d ./libs/ -p @executable_path/libs/
dylibbundler находится в одном каталоге с исполняемым файлом. Инструмент рекурсивно запускает "install_name_tool" для библиотеки и всех ее зависимостей (и копирует их в указанный каталог). Запуск otool -L на ./libs/libil.1.dylib возвращает:
@executable_path/libs/libIL.1.dylib (compatibility version 3.0.0, current version 3.0.0)
@executable_path/libs/libtiff.5.dylib (compatibility version 8.0.0, current version 8.0.0)
@executable_path/libs/liblzma.5.dylib (compatibility version 6.0.0, current version 6.4.0)
@executable_path/libs/libpng15.15.dylib (compatibility version 30.0.0, current version 30.0.0)
@executable_path/libs/libmng.1.dylib (compatibility version 2.0.0, current version 2.0.0)
@executable_path/libs/liblcms.1.dylib (compatibility version 2.0.0, current version 2.19.0)
@executable_path/libs/libjasper.1.dylib (compatibility version 2.0.0, current version 2.0.0)
@executable_path/libs/libjpeg.9.dylib (compatibility version 10.0.0, current version 10.0.0)
@executable_path/libs/libIlmImf.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libImath.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libHalf.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libIlmThread.6.dylib (compatibility version 7.0.0, current version 7.0.0)
@executable_path/libs/libIex.6.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
@executable_path/libs/libz.1.dylib (compatibility version 1.0.0, current version 1.2.7)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
Мне кажется, что он все правильно скопировал. Но когда я запускаю свое приложение, я получаю одно и то же исключение:
Unhandled Exception: System.DllNotFoundException: ./libs/libIL.1.dylib
Unhandled Exception: System.DllNotFoundException: @executable_path/libs/libIL.1.dylib
Unhandled Exception: System.DllNotFoundException: libs/libIL.1.dylib
Как вы можете видеть, я пробовал 3 разных способа ссылки на библиотеку, но она всегда не может найти ее.
Любая помощь будет принята с благодарностью, я пытаюсь решить эту проблему в течение нескольких месяцев.
ОБНОВИТЬ: Если я указываю абсолютный путь к dylib, он находит его, но затем жалуется на зависимости:
Mono: DllImport error loading library 'dlopen(/Users/me/myapp/libs/libil.1.dylib, 9): Library not loaded: @executable_path/libs/libtiff.5.dylib
Referenced from: /Users/me/myapp/libs/libil.1.dylib
Reason: image not found'.
Мне кажется, что @executable_path не заменяется фактическим абсолютным путем к исполняемому файлу.