Noch ein weiteres ld:symbol(s) not found for architecture x86_64-Problem mit boost, diesmal mit mgiza

Noch ein weiteres ld:symbol(s) not found for architecture x86_64-Problem mit boost, diesmal mit mgiza


Ich entschuldige mich dafür, dass ich eine so häufige Frage stelle; Ich kann da draußen keine Lösung finden, die funktioniert oder klar genug ist, um sie umzusetzen. Ich versuche einfach, mgiza zu installieren. Hier ist die INSTALL-Datei:


cmake .
make
make install
If you want to install to a custom location, add the following flag when you run cmake:
-DCMAKE_INSTALL_PREFIX=/path/to/custom/location
NOTE: Boost Version 1.48 has problem with the code, you can use either 1.46 or 1.50+. Unfortunately 1.48 is shipped with Ubuntu 12.04 LTS, you can either download and compile libboost 1.50+ from their website, or just do this:
sudo apt-get install libboost1.46-all-dev

Sieht einfach aus, oder? Geben Sie cmake . ein funktioniert ohne erkennbare Probleme. Leider make läuft bei boost auf diesen gefürchteten Fehler ("undefinierte Symbole ...").


1 warning generated.
Linking CXX executable ../bin/d4norm
Undefined symbols for architecture x86_64:
"std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::string::_Rep::_S_empty_rep_storage", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::string::assign(char const*, unsigned long)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Basierend auf anderen Fragen ist es ein Problem mit Mavericks, weil es Clang verwendet, um C++-Code zu kompilieren, was impliziert, dass die Bibliothek libc++ und nicht libstdc++ ist. Der Vollständigkeit halber und damit andere meine Fehler reproduzieren können, verwende ich OS X 10.9.5, Xcode 6.1 und meine Boost-Version ist 1.56 (Boost wurde über Homebrew installiert).


Jetzt müssen einige da sein da draußen reparieren, oder? Gehen wir einige davon durch:



  1. Anwenden des -m32-Flags:nicht anwendbar, da das Makefile
    kein "g++" enthält, und es sagt mir auch ausdrücklich, dass ich es NICHT
    bearbeiten soll, weil es ein "Cmake" ist generierte Datei.

  2. Irgendetwas in einer Header-Datei nicht definieren:nicht anwendbar, da der Code zum Kompilieren bereit sein sollte.

  3. Hinzufügen von -stdlib=libstdc++ zum Linker:Ich bin mir nicht sicher, wie ich das zu einem make hinzufügen soll Befehl? Ich habe versucht, einfach make -stdlib=libstdc++ zu machen und obwohl dies die obigen Fehler zu vermeiden schien, führte es einige zusätzliche Fehler ein:make: *** [all] Error 2 (nicht sicher, was das bedeutet).

  4. Verlinken mit richtigen Boost-Bibliotheken:Dort steht ein Kommentar, der besagt:„Sie müssen nur mit den richtigen Boost-Bibliotheken verlinken ... viele Fragen und Antworten dazu, wie das geht“. Leider denke ich nicht, dass eine der Fragen, die der Kommentator verlinkt hat, mein Problem anspricht.

  5. Verknüpfung von Qt mit Boost:Ich glaube nicht, dass dies anwendbar ist, weil ich Qt nicht verwende und nicht weiß, wo ich einen LIBS += [...] boost einfügen würde Linie.

  6. Verknüpfung einer fehlenden Datei:Bei diesem Problem scheint es mehr um das Verknüpfen zu gehen, wenn g++ ausgeführt wird aber ich verwende ein Makefile, das nicht g++ hat irgendwo darin.

  7. Verwendung von g++ vs. gcc:Ich weiß nicht, wie ich ändern kann, welche davon ich verwende, weil ich cmake verwende und make ...

  8. Ändern eines Verknüpfungsbefehls:Auch hier weiß ich nicht, wie ich die Zusammenstellung von cmake ändern kann /make bis gcc . (Anmerkung:Von diesem Punkt an werde ich die meisten Fragen ignorieren, die beantwortet werden, indem etwas zu gcc oder g++ hinzugefügt wird.)

  9. Ändern der C++-Standardbibliothek:Die Lösung besteht darin, in Xcode einzusteigen und dort die Bibliotheken zu ändern. Ich denke nicht, dass dies der richtige Ansatz ist, und auf jeden Fall würde ich wahrscheinlich etwas vermasseln, wenn ich eine Einstellung in Xcode ändern würde (ich habe auch keine Erfahrung mit der GUI von Xcode).

  10. Verknüpfen von Bibliotheken in Xcode:Ich denke, das ist ein ähnlicher Fall wie Nr. 9 auf dieser Liste. Die Antwort hier empfiehlt auch die Verwendung von Homebrew anstelle von Macports für die Installation von Boost, aber ich habe bereits gesagt, dass ich Homebrew für die Installation von Boost verwendet habe.

  11. Mit Clang kompilieren:Ein ähnliches Problem, aber wie bekomme ich cmake oder make dazu, mit Clang zu kompilieren?

  12. Aus einer (beliebten) Bitcoin-Ausgabe:Jetzt dies sieht interessant aus! Eine Menge Leute sind auf meinen Fehler gestoßen. Leider scheint es keinen Konsens oder eine einfache Lösung zu geben. Es gibt auch ein paar Lösungen, die ich nicht implementieren kann. Beispielsweise besteht eine Lösung von "imbolo" darin, Boost mit einem cxxflag-Flag zu kompilieren, aber was bedeutet das?


Also bin ich etwas ratlos, wie man mgiza richtig installiert ... ich meine, der ganze Sinn von mgiza gibt mir cmake und make ist so, dass ich nicht Sie müssen sich um die unordentlichen Details beim Kompilieren kümmern, oder? Dies ist jedoch nicht nur ein mgiza-Problem, da ich auf dieses Problem gestoßen bin, als ich versucht habe, make auszuführen anderswo. Ich verstehe die allgemeinen Ideen von (C)Makefiles, aber nicht die Details auf niedriger Ebene.


Antworten:


Um auf einige der Bedenken der Kommentatoren einzugehen:Der beste Weg, um mit diesem Problem umzugehen, besteht darin, zu versuchen, Ihr System so weit wie möglich zu bereinigen und den Prozess von vorne zu beginnen.


Seit dieser Veröffentlichung wurde auch OS X 10.10 Yosemite veröffentlicht, das dieses Problem möglicherweise behoben hat (IIRC, dieses Problem ist hauptsächlich auf 10.9 und die clang/gcc-Compiler-Änderungen zurückzuführen).


Einige Code-Antworten


cmake . make make install  If you want to install to a custom location, add the following flag when you run cmake: -DCMAKE_INSTALL_PREFIX=/path/to/custom/location  NOTE: Boost Version 1.48 has problem with the code, you can use either 1.46 or 1.50+. Unfortunately 1.48 is shipped with Ubuntu 12.04 LTS, you can either download and compile libboost 1.50+ from their website, or just do this: sudo apt-get install libboost1.46-all-dev 
1 warning generated. Linking CXX executable ../bin/d4norm Undefined symbols for architecture x86_64:   "std::string::_Rep::_M_destroy(std::allocator<char>
const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) "std::string::_Rep::_S_empty_rep_storage", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) "std::string::assign(char const*, unsigned long)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) "std::basic_string<char, std::char_traits<char>, std::allocator<char>
>::basic_string(char const*, std::allocator<char>
const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) "std::basic_string<char, std::char_traits<char>, std::allocator<char>
>::basic_string(std::string const&)", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) "std::basic_string<char, std::char_traits<char>, std::allocator<char>
>::~basic_string()", referenced from:
boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)