9 Stimmen

Wie kann ich eine dynamische Bibliothek in Xcode verknüpfen?

Ich entwickle derzeit ein Programm in Qt und es verwendet die Bibliothek libqextserialport.1.dylib.

Ich baue es und führe es in x-code aus, 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 ausführen, indem ich in den ausführbaren Ordner /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ wechsle und dort eingebe:

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

Ich weiß, dass es wahrscheinlich viele andere Lösungen als diese gibt. Kennt jemand die beste / eleganteste / einfachste von x-code zu tun?

4voto

north5 Punkte 393

Ich habe genau das getan, mit einem Modulbündel-Projekt. Dieses war in ein größeres Projekt mit einer separaten ausführbaren Datei eingebunden.

Ich habe einen Schritt "Copy dylibs to frameworks" hinzugefügt, der die Dylibs nach /Foobar.bundle/Contents/Frameworks/Foobar/ kopiert. Dann fügte ich eine "Run Script Phase" hinzu, die als letzter Schritt ausgeführt wird, um die Installationsnamen der Dylibs in der ausführbaren Datei zu fixieren:

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 verknüpfte libBobDylan.dylib auch mit libBillyIdol.dylib. Ich musste also eine weitere Run Script Phase ganz am Anfang des Targets hinzufügen, um die Installationsnamen hier zu korrigieren:

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

Ich hatte über ein Dutzend davon zu verlinken; ich musste den Lieferanten der Dylibs überreden, seinen Header aufzufüllen, um meine vielen install_name-Änderungen zu berücksichtigen ...

2voto

benzado Punkte 78100

Wenn ich Ihr Problem richtig verstehe, ist Ihre App gut gebaut, keine Fehler bei der Verknüpfung, aber wenn Sie versuchen, es zu starten die Bibliothek nicht gefunden werden kann.

Das ist nicht verwunderlich, denn die Dylib-Datei befindet sich in einem beliebigen Verzeichnis, das nicht im Systempfad liegt. Sie müssen sie entweder nach /usr/lib (wahrscheinlich keine gute Idee) oder in das Anwendungsbündel aufnehmen. Letzteres ist wahrscheinlich der bessere Ansatz.

Ich habe es nie ausprobiert, aber anscheinend muss man eine Dateien kopieren Bauphase um die Dylib in Ihr Bundle aufzunehmen und dann Xcode konfigurieren damit Ihre ausführbare Datei weiß, wo sie zu finden ist.

0voto

stefanB Punkte 72857

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

Ich habe dies mit sqlite3 und cocoa application (cocoa-touch) getestet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X