riferimento indefinito a "std :: cout"


197

Sarà questo l'esempio:

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

Genera l'errore:

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

Inoltre, questo esempio:

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

genera l'errore:

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

Nota: sto usando Debian Wheezy.


161
Prova g++invece di gcc. gccè per C e non ti darà accesso alla libreria standard C ++.
juanchopanza,

2
Bene, questo ha sicuramente risolto il problema. A quanto ho capito, GCC è l'acronimo di Gnu Compiler Collection. Non dovrebbe chiamare il compilatore g ++ quando necessario? Quindi il comando gcc chiama invece il compilatore c ...
D1X

1
@ D1X è perché hai invocato il linker separatamente dal compilatore. quando scrivi gcc -o edit main.onon sa che main.osaranno necessarie librerie di avvio C ++.
MM,


4
D: Non dovrebbe chiamare il compilatore g ++ quando necessario? A: Non più di gcc dovrebbe chiamare gfortran, gjc, ... ecc. Ecc. Secondo necessità.
paulsm4,

Risposte:


279

Compila il programma con:

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

come coutè presente nella libreria standard C ++, che avrebbe bisogno di collegamento esplicito con -lstdc++quando si utilizza gcc; g++collega la libreria standard per impostazione predefinita.

Con gcc, ( g++dovrebbe essere preferito sopra gcc)

gcc main.cpp -lstdc++ -o main.o

11
Esso può essere utilizzato per compilare il codice C ++, il fatto è che non si collega con la libreria C ++. gccfunzionerà bene se lo aggiungi -lstdc++.
Un tizio programmatore il

3
Ti preghiamo di includere sempre -Wallquando fornisci esempi da riga di comando gcc / g ++: aiuta a mettere in pratica i buongustai in una fase precoce e fa risparmiare tempo a tutti. ;-)
Paul R

4
Da quando gli iostreams fanno std::coutparte della Standard Template Library?
TC

1
Perché è necessario -Werror? Ho rivisto la documentazione e, se avrò capito bene, renderò gli errori di avvertimento e renderò i miei progetti meno facili da compilare.
D1X,

7
@ D1X: perché tra i programmatori c'è una brutta abitudine di ignorare gli avvisi. Praticamente tutto ciò che -Walle anche solo -Wextraavvisare è un problema molto reale o una codifica sciatta che può essere facilmente risolta. Il messaggio qui è prendere l'abitudine di considerare gli avvisi del compilatore un utile puntatore a dove il tuo codice potrebbe essere migliorato, invece di un fastidio. Ci sono centinaia di domande qui su SO che non sarebbero state necessarie in primo luogo se l'OP avesse usato -Wall -Wextra. -Werrorlo sta semplicemente rinforzando.
DevSolar,

42

Sì, usando il g++comando ha funzionato per me:

g++ my_source_code.cpp

1
quindi corri con./a.out
kaleidawave il

2

Makefiles

Se stai lavorando con un makefile e sei finito qui come me, allora questo è probabilmente quello che stai cercando o:

Se stai usando un makefile, devi cambiare cccome mostrato di seguito

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

per

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.