referência indefinida a 'std :: cout'


194

Este deve ser o exemplo:

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

Ele lança o erro:

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

Além disso, este exemplo:

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

lança o erro:

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: Estou usando o Debian Wheezy.


158
Tente em g++vez de gcc. gccé para C e não lhe dará acesso à biblioteca padrão do C ++.
precisa saber é o seguinte

2
Bem, isso definitivamente resolveu o problema. Pelo que entendi, GCC é o acrônimo para Gnu Compiler Collection. Não deveria chamar o compilador g ++ quando necessário? Portanto, o comando gcc chama o compilador c em vez ...
D1X

1
@ D1X é porque você invocou o vinculador separadamente do compilador. quando você escreve gcc -o edit main.o, não sabe que main.oprecisará das bibliotecas de inicialização do C ++.
2626 MM


4
P: Não deveria chamar o compilador g ++ quando necessário? R: Não mais do que o gcc deve chamar gfortran, gjc, ... etc. etc., conforme necessário.
paulsm4

Respostas:


275

Compile o programa com:

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

como coutestá presente no C ++ biblioteca padrão, que precisaria de ligação explícita com -lstdc++quando se usa gcc; g++vincula a biblioteca padrão por padrão.

Com gcc, ( g++deve ser preferido gcc)

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

11
Ele pode ser usado para compilar código C ++, o fato é que ele não se vincula à biblioteca C ++. gccfuncionará bem se você apenas adicionar -lstdc++.
Algum programador,

3
Sempre inclua -Wallao fornecer exemplos de linha de comando gcc / g ++ - isso ajuda a colocar os noobs em bons hábitos desde o início e economiza tempo a todos mais adiante. ;-)
Paul R

4
Desde quando o iostreams faz std::coutparte da Biblioteca de modelos padrão?
TC

1
Por que -Werror é necessário? Revisei a documentação e, se entender bem, fará com que os erros de aviso e tornem meus projetos menos fáceis de compilar.
D1X 31/01

7
@ D1X: Porque há um hábito desagradável entre os programadores de ignorar avisos. Praticamente tudo o que -Walle até -Wextraalertar é um problema muito real ou uma codificação desleixada que pode ser facilmente corrigida. A mensagem aqui é criar um hábito em que você considera os avisos do compilador um ponteiro útil para onde seu código pode ser aprimorado, em vez de um incômodo. Existem centenas de perguntas aqui no SO que, em primeiro lugar, não seriam necessárias se o OP tivesse usado -Wall -Wextra. -Werrorestá simplesmente reforçando isso.
DevSolar 02/02


2

Makefiles

Se você está trabalhando com um makefile e acabou aqui como eu, provavelmente é o que está procurando ou:

Se você estiver usando um makefile, precisará alterar ccconforme mostrado abaixo

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

para

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.