2009-03-12 7 views
9

В настоящее время я разрабатываю программу в Qt и использует библиотеку libqextserialport.1.dylib.Как связать динамическую библиотеку в Xcode?

я построить и запустить в х-коде и он выплевывает обратно:

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/сборки /.

я могу запустить свою программу, изменив к исполняемой папке /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

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

ответ

2

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

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

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

+0

что делать, если вы создаете исполняемый файл без пакета? – John

0

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

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

4

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

Я добавил шаг «Копировать dylibs to frameworks», который скопировал dylibs в /Foobar.bundle/Contents/Frameworks/Foobar/. Затем я добавил этап Run Script для запуска в качестве последнего шага, чтобы исправить установки имена 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. Так что мне пришлось добавить еще один этап Run Script в самом начале Target, чтобы исправить установки имен здесь:

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

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

Смежные вопросы