Umgang mit "dyld: faul symbol binding Fehler: Symbol not found" Fehler, wenn nm nicht finden symbol
Ich habe eine fat (32 - und 64-bit) Intel binary genannt myBinary
Fehler bei der Ausführung auf einer anderen workstation ausgeführt wird Mac OS X 10.8.2:
$ myBinary
dyld: lazy symbol binding failed: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
Referenced from: /usr/local/bin/myBinary
Expected in: /usr/lib/libstdc++.6.dylib
dyld: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
Referenced from: /usr/local/bin/myBinary
Expected in: /usr/lib/libstdc++.6.dylib
Trace/BPT trap: 5
Ich es kompiliert von einem Mac OS X 10.8.2 workstation mit GCC 4.7.2:
$ gcc --version
gcc (MacPorts gcc47 4.7.2_2+universal) 4.7.2
Lief ich nm
und das symbol nicht definiert ist:
$ nm /usr/local/bin/myBinary | grep __ZNSt8__detail15_List_node_base7_M_hookEPS0_
U __ZNSt8__detail15_List_node_base7_M_hookEPS0_
Hab ich was verpasst oder falsch gemacht beim kompilieren myBinary
? Ich bin mir nicht sicher, was ich tun kann ein fehlendes symbol in /usr/lib/libstdc++.6.dylib
— sollte ich statisch kompiliert der C++ - Bibliothek in myBinary
?
- Es scheint, dass meine Antwort nicht zu befriedigen Sie. Könnten Sie mehr details dann? Ist ein anderes system, hat GCC 4.7 installiert?
- Wie es scheint, müssen Sie die Verknüpfung zu einer nicht-standard-libstdc++. Ich habe nicht diese Symbole in meiner Kopie. Es sollte wirklich nicht sein, in /usr/lib in diesem Fall, obwohl. Darf ich Fragen, warum Sie nicht mit clang? Warum verwenden Sie gcc von MacPorts? Warum nicht zumindest mit apples gcc?
- Clang unterstützt einige der C++11-features, die wir verwenden. Darüber hinaus möchte ich sicherstellen, dass unsere tools können gebaut mit GCC-Compiler, und erfahren Sie, warum diese defekt ist und was ich tun kann, diese zu lösen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
yeah du hast 2 Möglichkeiten, entweder nicht verwenden Bibliotheken, die der Kunde nicht haben... (können Sie als dyld oder Rahmen.)
oder einfach nur statisches linken der Bibliothek.... das wird eigentlich am Ende wird kleiner im Speicher und Speicherplatz, wenn Ihr Paket ist nur ein Prozess, da kann man-strip-Symbole, die Sie nicht verwenden.
Jeder C++ - compiler hat seine eigene Implementierung der Standard-C++ - Bibliothek. Da Sie mit externen compiler (GCC 4.7) seine Bibliothek nicht verfügbar bei standard-Installationen von Mac OS X.
Ihre einzigen Optionen sind, entweder bundle die Bibliothek innerhalb Ihrer app oder statisch verlinken.
Bündeln die Bibliothek mit der app:
Update installieren, name der Bibliothek, die mit
install_name_tool
Sicherzustellen, dass Ihre app finden, wenn benötigt
E. g. Sie können die dylib in .app/Contents/Frameworks, setzen Sie die Installation Namen
@rpath
und kompilieren Sie die app mit der-rpath @executable_path/../Frameworks
.Ich lief in das gleiche Problem beim kompilieren auf 10.6 mit MacPorts GCC 4.8, und dann versucht zu starten meiner Anwendung für ein frisches 10.9 installieren ohne MacPorts. Zum Glück fand ich Ihre Frage, und Kentzo Antwort lotste mich in die richtige Richtung, wie auf warum das problem aufgetreten ist... aber es hat nicht wirklich die Lösung, die ich suchte.
Zuerst werde ich erklären, warum es auf Ihrem system läuft richtig: MacPorts hat, vorausgesetzt, Ihr system mit der version von libstdc++ GCC 4.7 ist die Bereitstellung Symbole für unter /opt/local/lib statt /usr/lib. Hier ist, was es sieht aus wie bei mir (mit GCC 4.8 universal):
Und Sie können sehen, was Ihre Anwendung verknüpft ist mit
otool -L
:Der einfachste Weg zur Verbesserung der Portabilität ist
-static-libstdc++ -static-libgcc
Sie in Ihrem letzten gcc-build-Schritt (der, der ruft den linker). Sie brauchen beide, da die dynamische libgcc bringen dynamische libstdc++ - Bindung, so dass es nicht reicht, fordern Sie einfach static-libstdc++. Für eine einfache Anwendung, hier ist, was Ihr gcc-Zeile Aussehen könnte:Jedoch nach der gcc man-Seite über linker-Optionen, statisch gelinkt libgcc können Probleme verursachen, wenn die Handhabung von Ausnahmen für Bibliotheken. Ich habe kein Probleme mit ihm, aber Sie könnten.
So, um es Kentzo Weg, zuerst sollten Sie sich die neueste install_name_tool von MacPorts, damit er nicht verwirrt durch unbekannte load-Kommandos:
Nun ändern wir den Pfad, so durchsucht er das Verzeichnis der ausführbaren Datei:
Nun müssen Sie nur verteilen Sie diese dylibs mit der Anwendung. Wenn Sie eine .app, kopieren Sie die dylibs an myBinary.app/Contents/MacOS/.
Eine Letzte Anmerkung: Wenn Sie Schwierigkeiten haben, eine gute universal binary, so dass es möglich ist, bauen die Architekturen separat (mit unterschiedlichen Compiler und-Optionen) und dann mischen Sie Sie mit lipo: