undefinierter Verweis auf `std :: ios_base :: Init :: Init () '

73

Ich schreibe diesen Code, um 3 Dateien zu lesen, TM ist die Größe der quadratischen Matrix, LER die Anzahl der Zeilen eines Arrays und definiere vom letzten Wert eine nicht quadratische Matrix von (ler / 2) * 2

Dann ... las der Code eine Datei mit einigen Beziehungen, alle sind Zahlen und werden C [ler] zugewiesen.

Dann wird C [ler] B [ler / 2] [2] zugewiesen.

Diese Koordinaten pro Zeile in B [ler / 2] [2] werden a und b zugewiesen.

a und b sind die Zeile und die Spalte der Matrix A [tm] [tm], in der 1 hinzugefügt werden soll.

Mein Code stürzt ab und ich sehe den Fehler nicht.

Wenn ich versuche, es zu kompilieren, fordert der Compiler gcc -g -o MatSim MatSim.cpp Folgendes auf :

/usr/include/c++/4.6/iostream:75: undefined reference to `std::ios_base::Init::Init()'
/usr/include/c++/4.6/iostream:75: undefined reference to `std::ios_base::Init::~Init()'
collect2: ld returned 1 exit status

Wenn ich versuche, es zu kompilieren, fordert der Compiler f77 -o MatSim MatSim.cpp Folgendes auf :

/tmp/cc6ewlkf.o: In function `__static_initialization_and_destruction_0(int, int)':
MatSim.cpp:(.text+0x17ad4a): undefined reference to `std::ios_base::Init::Init()'
MatSim.cpp:(.text+0x17ad4f): undefined reference to `std::ios_base::Init::~Init()'
collect2: ld returned 1 exit status

Lösung

Das Hauptproblem war ein Bibliotheksproblem. Kompilieren Sie Ihren Code mit:

 g++ -g -o MatSim MatSim.cpp -lstdc

Funktioniert immer noch nicht? Bibliotheken installieren:

sudo apt-get install g++-multilib
Another.Chemist
quelle
Gibt der Compiler einen Fehler aus? Sind Sie sicher, dass Sie richtig liegen, wenn Sie sagen "Der Compiler hat einen Exit-Status von 1 vergeben" und nicht das Programm einen Exit-Status von 1?
Celeritas
Celeritas, ja, das ist es, was ich direkt erhalte, nachdem ich einen der Compiler ausgeführt habe [gcc o f77]
Another.Chemist
Mögliches Duplikat von Kann C ++ - Bibliotheken unter Unix nicht finden
Jonathan Leffler
Danke Jonathan Leffler !!!! Sie und Reinier haben meinen Code aufgeklärt und jetzt kann ich wirklich weitermachen !!!!
Another.Chemist

Antworten:

144

Sie können dies auf verschiedene Arten beheben:

  • Verwenden Sie g++anstelle von gcc:g++ -g -o MatSim MatSim.cpp
  • Hinzufügen -lstdc++:gcc -g -o MatSim MatSim.cpp -lstdc++
  • Ersetzen <string.h>durch<string>

Dies ist ein Linker-Problem, kein Compiler-Problem. Das gleiche Problem wird in der Frage iostream linker error behandelt - es erklärt, was los ist.

Reinier Torenbeek
quelle
Danke Reiner ... Ich habe Ihren Vorschlag ausprobiert und bekomme: g ++ -g -o MatSim MatSim.cpp -lstdc / usr / bin / ld: -lstdc collect2 kann nicht gefunden werden: ld hat 1 Exit-Status zurückgegeben
Another.Chemist
Wenn Sie sich für die Option für zusätzliche Bibliotheken entscheiden, sollten Sie diese -lstdc++nicht verwenden -lstdc. Wenn Sie jedoch g ++ verwenden, ist es nicht erforderlich, diese Bibliothek hinzuzufügen.
Reinier Torenbeek
Danke Reinier !!!! Sie und Jonathan Leffler haben meinen Code aufgeklärt und jetzt kann ich wirklich weitermachen !!!!
Another.Chemist
2
Ich denke, das ist ein menschlicher Fehler: Es ist nicht richtig, C ++ - Code mit gcc (anstelle von g ++) zu kompilieren (da ich selbst falsch gemacht und hier gegoogelt habe :)
Zac
Ich habe versucht, ndk-build to jni directory. Ich denke deine Antwort für eine .cpp nicht für das Verzeichnis. Hast du eine Lösung?
Mikalaj Susla
7

Die meisten dieser Linkerfehler treten aufgrund fehlender Bibliotheken auf.

Ich habe die libstdc ++. 6.dylib in meinem Projekt-> Ziele-> Build-Phasen-> Binär mit Bibliotheken verknüpfen hinzugefügt.

Das hat es für mich unter Xcode 6.3.2 für iOS 8.3 gelöst

Prost!

Arjun Shukla
quelle
Danke, dass du das geteilt hast, Mann. Du hast gerade mein Problem gelöst. Ich habe versucht, ein Ziel für den Einheitstest in meinem Projekt mit gtest-1.7.0 Framework und Xcode Version 6.3.2 zu kompilieren.
Eduardo Reis