Nicht in der Lage, eine Anwendung auszuführen, kompiliert unter OS-X Snow Leopard (10.6.7) auf einem anderen Mac mit OS-X Leopard (10.5.8). libstdc++.6.dylib-Fehler zurückgegeben
Ich versuche ein fertiges C++ Projekt mit C++0x und Oger auf Max OS-X und ich auch eine übertragbarkeit problem zwischen OS-X-Versionen.
Ich habe es geschafft, mein Projekt kompilieren unter Mac OS-X 10.6 (Snow Leopard) mit GCC 4.6.0 (da brauchte ich C++0x). Es war schwer (wahrscheinlich, weil ich eine neue OSX-Benutzer), aber es schließlich kompiliert es ohne Fehler.
I enthalten alle erforderlichen Komponenten, Frameworks, Plugins etc. benötigt in der Anwendung.app-bundle und es tut starten Sie gut auf das Mac-OS-X-10.6
Aber wenn ich übertragen Sie das Projekt auf meinem alten laptop installiert mit Mac OS-X 10.5.8 ich bin nicht in der Lage, um die Anwendung auszuführen.
Wenn ich Doppelklick auf die .app, es zu versuchen, zu starten und schließlich das Symbol verschwindet aus dem Menü bar und das ist alles. Aber wenn ich führen Sie die ausführbare Datei enthalten, in der .app direkt gibt es den folgenden Fehler:
MacBook-2:~ root# /var/root/Desktop/MyProject.app/Contents/MacOS/MyProject ; exit;
dyld: lazy symbol binding failed: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
Expected in: /usr/lib/libstdc++.6.dylib
dyld: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
Expected in: /usr/lib/libstdc++.6.dylib
Trace/BPT trap
logout
Hier ist das Programm-bundle-Struktur anzeigen.
MyProject.app
- Komponenten
- ... (Ogre-Komponenten)
- Frameworks
- Oger.Rahmen
- MacOS
- MyProject (executable)
- Plugins
- ... (Ogre plugins)
- Ressourcen
- ... (Oger .cfg + mein Vermögen)
Sagte ich Cmake zu verwenden, die MacOSX10.5.sdk (in der Cmake-GUI, nicht in der CMakeList.txt):
- CMAKE_OSX_DEPLOYEMENT_TARGET 10.5
- CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk
Aber es scheint nicht, etwas zu ändern...
Libstdc++.dylib-Datei, links zu libstdc++.6.0.9.dylib auf dem Mac verwendet, um die Anwendung zu kompilieren in der Erwägung, dass es links zu libstdc++.6.0.4.dylib auf dem Mac verwendet, um zu testen Portabilität.
Aber als ich sagte, dass die MacOSX10.5.sdk ich würde es allerdings verwenden die libstdc++.6.0.4.dylib zur compile-Zeit, so kann es laufen auf dem Mac installiert und mit 10.5
In der Tat das Ziel ist es, läuft auf dem zweiten Mac (und alle Mac mit 10.5+), ohne etwas zu ändern auf Sie. Einfach downloaden und ausführen...
Hat jemand kann sagen, dass mein, was fehlt mir hier ? (Ich fühle mich nicht wirklich fließend mit der OS-X-Methoden und-organisation, also könnte ich verpasst haben, etwas ganz grundlegendes, nicht Angst zu sein, roh ^^).
Wie kann ich festlegen, das gezielte SDK in Cmake ? (Sind die verwendeten Cmake-Befehle nicht ausreichen ?)
Ich verwenden Sie die folgenden kompilieren meines Projekts:
- Mac-OS-X-10.6.7
- GCC 4.6.0
- Cmake 2.8-4
- Oger 1.7.3
Ich verwende Folgendes um zu testen, das Projekt:
- Mac OS-X 10.5.8 (es gibt einige dev tools installiert. Ich glaube, ich muss es sagen, falls es stören könnte mit den Anwendungen).
Edit:
Als ich entdeckte, otool hier ist der log zurückgegeben
Valkeas-Mac:MacOS root# otool -L MyProject
MyProject:
@executable_path/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre (compatibility version 0.0.0, current version 1.7.3)
@executable_path/../Components/libOgreTerrain.dylib (compatibility version 0.0.0, current version 1.7.3)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/opt/local/lib/gcc46/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.15.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/gcc46/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.19.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.54.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 34.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.26.0)
Valkeas-Mac:MacOS root#
Offensichtlich es links zu den gcc46 libstdc++.6.dylib (wohl normal, wie ich denke, diese Datei enthält die C++0x Funktionen der GCC-4.6.0).
Gibt es also keine Lösung ? (-static gibt einen Fehler zurück, dass zu sagen, brauche ich Dynamik...)
- GCC 4.6.0? Das ist nicht ein compiler ausgeliefert, die von Apple. Versuchen Sie es mit gcc-4.0.1 oder gcc-4.2.1 was sind das nur 2 Versionen von GCC enthalten in Xcode.
- Ich brauche C++0X, und der Compiler unterstützt von Xcode unterstützt keine C++0x. Das ist, warum ich kompilieren, ohne Xcode und das ist auch der Grund, warum ich ein gcc-version größer als 4.4
- Dann bist leider du wahrscheinlich kein Glück, bis llvm/Clang unterstützt C++0x.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
libstdc++
Sie bei Verwendung von gcc-4.6. Da bist du mit C++0x, die ist nicht verfügbar in der version von gcc, die im Lieferumfang von OS X, ist es keine überraschung, dass der eingebautelibstdc++
funktioniert nicht. Sie versenden müssen, dielibstdc++.dylib
Sie verwenden in Ihrer Anwendung bundle (Sie können es in, zB, Ihre.app/Contents/Libraries). Verwendeninstall_name_tool
um sicherzustellen, dass es auf die verwiesen wird, über einen relativen Pfad (Nutzung@rpath
oder@executable_path
).otool -L
auf meine osx-Projekt: Es scheint, wie ich früherinstall_name_tool -change /opt/local/lib/gcc46/libstdc++.6.dylib @executable_path/libs/libstdc++.6.dylib FILENAME
auf die exe-Datei und der ogre-plugins (aber ich bin nicht sicher, es ist obligatorisch für die plugins...) und platziert die gcc46 libstdc++.6.dylib-Datei im Ordner libs neben der ausführbaren Datei.libgcc_s.1.dylib
helfen--ich habe eine Frage für meine version dieses problem, mit allen Mitteln, diesen post und alles, was Sie denken, und ich nehme an/+1 es entsprechend, wenn es funktioniert.install_name_tool -change
auflibgcc_s.1.dylib
aber es gibt keine visuelle Bestätigung, dass an meinem letzten OSX-version mitotool -L
. Also ich denke, es war schließlich nutzlos. Jedoch verwenden Sie es auf Abhängigkeiten Dateien war ein wichtiger Punkt, denke ich. Zum Glück, ich hatte es einmal auf Abhängigkeiten und ich gescriptet es für die exe-Datei (mit CMake Befehladd_custom_command
undPOST_BUILD
) so geändert wird, jedes mal, wenn ich neu kompilieren.Während die ausgewählte Antwort ist wohl praktischer zu viele, das ist tatsächlich ein bug in Apple ' s toolchain, das ist trivial mit einem festen, sehr kleinen patch. Es ist sicherlich falsch, die Schuld für das Problem auf die mithilfe von C++0x, oder sogar die Schuld für das Problem auf, die mit verschiedenen Versionen des gcc: dieses Zeug ist in der Regel funktionieren soll. Angesichts der Tatsache, wie viele Leute scheinen dieses Problem tritt auf, da Benutzer (Beurteilung durch eine Google-Suche) hoffentlich behoben werden kann stromaufwärts in Xcode 5.1 (obwohl angesichts der selbstgefälligen Reaktion, die ich bekommen habe in der Vergangenheit von Apple mit Bezug auf einfache fünf-Minuten-Updates zur besseren Unterstützung von Abwärtskompatibilität, ich werde nicht meinen Atem; ich werde die Datei ein radar-unabhängig davon, wie halte ich diese Art der Sache wirklich wichtig). Die Lösung ist das ändern der ostream-header hinzufügen __AUSRICHTUNG_4_0_DYLIB Wachen um den operator<< implementation für strings. Ich legte ein Pflaster auf meiner website bei http://test.saurik.com/apple/ostream1.diff.