Как я могу связать динамическую библиотеку в XCode? - PullRequest
9 голосов
/ 12 марта 2009

Я сейчас занимаюсь разработкой программы на Qt, и она использует библиотеку libqextserialport.1.dylib.

Я собираю его и запускаю в x-коде, и он выплевывает обратно:

dyld: Library not loaded: libqextserialport.1.dylib
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV
    Reason: image not found

Библиотека находится в /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/.

Я могу запустить свою программу, перейдя в исполняемую папку /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ и введя:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

Я знаю, что, возможно, помимо этого есть много решений. Кто-нибудь знает лучшее / самое элегантное / простое в использовании из x-code?

Ответы [ 3 ]

4 голосов
/ 15 июня 2009

Я только что сделал это с помощью проекта Module Bundle. Это было включено в более крупный проект с отдельным исполняемым файлом.

Я добавил шаг «Копировать dylibs в frameworks», который копировал dylibs в /Foobar.bundle/Contents/Frameworks/Foobar/. Затем я добавил фазу запуска сценария для запуска в качестве последнего шага, чтобы исправить имена установки dylibs в исполняемом файле:

install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar

Конечно, libBobDylan.dylib также связан с libBillyIdol.dylib. Поэтому мне пришлось добавить еще одну фазу запуска сценария в самом начале цели, чтобы исправить имена установки здесь:

install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib

У меня было более дюжины из них, чтобы связать их; Мне пришлось убедить поставщика dylibs дополнить их заголовок, чтобы учесть мои многочисленные изменения install_name ...

2 голосов
/ 12 марта 2009

Если я правильно понимаю вашу проблему, ваше приложение работает нормально, при компоновке ошибок нет, но при попытке запустить библиотеку не удается найти.

Это не удивительно, поскольку файл dylib находится в некотором произвольном каталоге, который не находится в системном пути. Вам нужно либо скопировать его в /usr/lib (вероятно, не очень хорошая идея), либо включить его в комплект приложений. Последнее, вероятно, лучший подход.

Я никогда не пробовал, но, очевидно, вам нужно использовать Фаза сборки файлов копирования , чтобы поместить dylib в ваш пакет, а затем настроить Xcode , чтобы ваш исполняемый файл знал где его найти.

0 голосов
/ 15 июня 2009

Вы просто перетаскиваете библиотеку из каталога в ваш проект XCode, лучше всего в ресурсы, но это не имеет значения (я считаю). Я пробовал с «копированием файлов в пакет» и без него, и оно работает в обоих случаях, но я не уверен, нужно ли включать его в пакет для развертывания.

Я проверял это с sqlite3 и приложением какао (cocoa-touch).

...