2009-03-12 11 views
9

Ich entwickle gerade ein Programm in Qt und es verwendet die Bibliothek libqextserialport.1.dylib.Wie kann ich eine dynamische Bibliothek in Xcode verknüpfen?

baue ich es und in x-Code ausführen und es spuckt zurück:

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

Die Bibliothek befindet sich in/Users/samuelreh/Desktop/QtOpenCV/qextserialport/build /.

Ich kann mein Programm durch Änderung der ausführbaren Ordner /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ laufen und eingeben:

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

Ich weiß, Es gibt wahrscheinlich noch viele andere Lösungen. Wer kennt die besten/elegantesten/einfachsten von x-code?

Antwort

2

Wenn ich Ihr Problem richtig verstehe, baut Ihre App gut, keine Fehler beim Verknüpfen, aber wenn Sie versuchen, es zu starten, kann die Bibliothek nicht gefunden werden.

Das ist nicht verwunderlich, da sich die dylib-Datei in einem beliebigen Verzeichnis befindet, das sich nicht im Systempfad befindet. Sie müssen es entweder in /usr/lib kopieren (wahrscheinlich keine gute Idee) oder es in das Anwendungspaket aufnehmen. Letzteres ist wahrscheinlich der bessere Ansatz.

Ich habe es noch nie versucht, aber anscheinend müssen Sie eine Copy Files Build Phase verwenden, um die Dylib in Ihr Bündel und dann configure Xcode, so dass Ihre ausführbare Datei wird wissen, wo es zu finden.

+0

Was ist, wenn Sie eine ausführbare Datei ohne Bundle erstellen? – John

0

Sie ziehen einfach die Bibliothek aus dem Verzeichnis auf Ihr Xcode-Projekt, am besten in Ressourcen, aber es spielt keine Rolle (glaube ich). Ich habe es mit und ohne Überprüfung der "kopiere Dateien in Bundle" versucht und es funktioniert in beiden Fällen, nicht sicher, ob Sie es in Bundle für die Bereitstellung einschließen müssen.

Ich habe dies mit sqlite3 und Kakao-Anwendung (Kakao-Touch) getestet.

4

Ich habe genau dies mit einem Modul Bundle-Projekt getan. Dies wurde in ein größeres Projekt mit einer separaten ausführbaren Datei aufgenommen.

Ich habe einen Schritt "Dylibs zu Frameworks kopieren" hinzugefügt, der die Dylibs nach /Foobar.bundle/Contents/Frameworks/Foobar/ kopiert hat. Dann habe ich ein Skript ausführen Phase als letzter Schritt ausgeführt werden, um die Installations Namen der dylibs in der ausführbaren Datei zu beheben:

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 

Natürlich libBobDylan.dylib auch libBillyIdol.dylib verknüpft. Also musste ich eine anderes Skript ausführen Phase ganz am Anfang des Ziels hinzufügen, um die Installation von Namen zu beheben hier:

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

ich ein Dutzend von ihnen über hatte zu verknüpfen gegen; Ich musste den Lieferanten der Dylibs dazu überreden, ihre Kopfzeile aufzufüllen, um meine vielen Änderungen von install_name unterzubringen ...

Verwandte Themen