undefinierter Verweis auf 'std :: cout'

194

Soll dies das Beispiel sein:

#include <iostream>
using namespace std;
int main()
{
    cout << "Hola, moondo.\n";
}

Es wirft den Fehler:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)':
main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

Auch dieses Beispiel:

#include <iostream>
int main()
{
    std::cout<<"Hola, moondo.\n";
}

wirft den Fehler:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

Hinweis: Ich verwende Debian Wheezy.

D1X
quelle
158
Versuchen Sie g++statt gcc. gccist für C und gibt Ihnen keinen Zugriff auf die C ++ - Standardbibliothek.
Juanchopanza
2
Nun, das hat das Problem definitiv gelöst. Soweit ich weiß, ist GCC das Akronym für Gnu Compiler Collection. Sollte es nicht bei Bedarf den g ++ - Compiler aufrufen? Also ruft der Befehl gcc stattdessen den c-Compiler auf ...
D1X
1
@ D1X, weil Sie den Linker getrennt vom Compiler aufgerufen haben. Wenn Sie schreiben gcc -o edit main.o, weiß es nicht, dass main.oC ++ - Startbibliotheken benötigt werden.
MM
4
F: Sollte es nicht bei Bedarf den g ++ - Compiler aufrufen? A: Nicht mehr als gcc sollte nach Bedarf gfortran, gjc, ... usw. usw. aufrufen.
Pauls4

Antworten:

274

Kompilieren Sie das Programm mit:

g++ -Wall -Wextra -Werror -c main.cpp -o main.o
     ^^^^^^^^^^^^^^^^^^^^ <- For listing all warnings when your code is compiled.

so coutist in der C ++ Standard - Bibliothek, die brauchen würde explizite Verbindungen mit -lstdc++bei der Verwendung gcc; g++verknüpft standardmäßig die Standardbibliothek.

Mit gcc, ( g++sollte vorgezogen werden gcc)

gcc main.cpp -lstdc++ -o main.o
Shauryachats
quelle
11
Es kann zum Kompilieren von C ++ - Code verwendet werden. Die Sache ist, dass es nicht mit der C ++ - Bibliothek verknüpft ist . gccwird gut funktionieren, wenn Sie nur hinzufügen -lstdc++.
Einige Programmierer Typ
3
Bitte -Wallgeben Sie immer an, wenn Sie gcc / g ++ - Befehlszeilenbeispiele angeben. Dies hilft, Noobs frühzeitig in gute Gewohnheiten zu bringen, und spart jedem später Zeit. ;-)
Paul R
4
Seit wann ist iostreams std::coutTeil der Standardvorlagenbibliothek?
TC
1
Warum wird -Werror benötigt? Ich habe die Dokumentation überarbeitet und wenn ich sie gut verstehe, werden die Warnungen fehlerhaft und meine Projekte sind weniger einfach zu kompilieren.
D1X
7
@ D1X: Weil es unter Programmierern eine üble Angewohnheit ist , Warnungen zu ignorieren . Praktisch alles, worüber -Wallund sogar -Wextragewarnt wird, ist entweder ein sehr reales Problem oder eine schlampige Codierung, die sehr einfach behoben werden kann. Die Botschaft hier ist, sich daran zu gewöhnen, dass Sie Compiler-Warnungen als hilfreichen Hinweis darauf betrachten, wo Ihr Code verbessert werden könnte, anstatt als störend. Es gibt hier Hunderte von Fragen zu SO, die überhaupt nicht notwendig gewesen wären, wenn das OP verwendet hätte -Wall -Wextra. -Werrorverstärkt einfach das.
DevSolar
42

Ja, die Verwendung des g++Befehls hat bei mir funktioniert:

g++ my_source_code.cpp
AB
quelle
dann laufen mit./a.out
kaleidawave
2

Makefiles

Wenn Sie mit einem Makefile arbeiten und wie ich hier gelandet sind, dann ist dies wahrscheinlich das, wonach Sie suchen oder:

Wenn Sie ein Makefile verwenden, müssen Sie ccwie unten gezeigt ändern

my_executable : main.o
    cc -o my_executable main.o

zu

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
iggy12345
quelle