référence non définie à 'std :: cout'

198

Sera-ce l'exemple:

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

Il jette l'erreur:

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

Aussi, cet exemple:

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

jette l'erreur:

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

Remarque: j'utilise Debian Wheezy.

D1X
la source
161
Essayez g++au lieu de gcc. gccest pour C et ne vous donnera pas accès à la bibliothèque standard C ++.
juanchopanza
2
Eh bien, cela a définitivement résolu le problème. Si je comprends bien, GCC est l'acronyme de Gnu Compiler Collection. Ne devrait-il pas appeler le compilateur g ++ en cas de besoin? Donc, la commande gcc appelle le compilateur c à la place ...
D1X
1
@ D1X c'est parce que vous avez appelé l'éditeur de liens séparément du compilateur. lorsque vous écrivez, gcc -o edit main.oil ne sait pas qu'il main.ofaudra des bibliothèques de démarrage C ++.
MM le
4
Q: Ne devrait-il pas appeler le compilateur g ++ en cas de besoin? R: Pas plus que gcc ne devrait appeler gfortran, gjc, ... etc. etc. selon les besoins.
paulsm4

Réponses:

280

Compilez le programme avec:

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

tel qu'il coutest présent dans la bibliothèque standard C ++, qui nécessiterait un lien explicite avec -lstdc++lors de l'utilisation gcc; g++lie la bibliothèque standard par défaut.

Avec gcc, ( g++devrait être préféré à gcc)

gcc main.cpp -lstdc++ -o main.o
shauryachats
la source
11
Il peut être utilisé pour compiler du code C ++, le fait est qu'il n'est pas lié à la bibliothèque C ++. gccfonctionnera très bien si vous ajoutez simplement -lstdc++.
Un mec programmeur le
3
Veuillez toujours inclure -Walllorsque vous donnez des exemples de ligne de commande gcc / g ++ - cela aide les noobs à adopter de bonnes habitudes à un stade précoce et fait gagner du temps à tout le monde plus tard. ;-)
Paul R
4
Depuis quand iostreams fait-il std::coutpartie de la bibliothèque de modèles standard?
TC
1
Pourquoi -Werror est-il nécessaire? J'ai révisé la documentation et si je comprends bien, cela fera des erreurs d'avertissement et rendra mes projets moins faciles à compiler.
D1X
7
@ D1X: Parce qu'il y a une mauvaise habitude chez les programmeurs d' ignorer les avertissements. Pratiquement tout ce qui -Wallet même -Wextraavertir est soit un problème très réel, soit un codage bâclé qui peut très facilement être corrigé. Le message ici est de prendre l'habitude de considérer les avertissements du compilateur comme un pointeur utile vers où votre code pourrait être amélioré, au lieu d'une nuisance. Il y a des centaines de questions ici sur le SO qui n'auraient pas été nécessaires en premier lieu si le PO avait utilisé -Wall -Wextra. -Werrorrenforce simplement cela.
DevSolar
42

Oui, l'utilisation de la g++commande a fonctionné pour moi:

g++ my_source_code.cpp
UN B
la source
1
puis courir avec./a.out
kaleidawave
2

Makefiles

Si vous travaillez avec un makefile et que vous vous êtes retrouvé ici comme moi, alors c'est probablement ce que vous cherchez ou:

Si vous utilisez un makefile, vous devez changer cccomme indiqué ci-dessous

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

à

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
iggy12345
la source