Por que recebo erros de “referência indefinida” compilando um programa C ++ simples com o gcc?

3

Eu tento compilar o c ++ no Ubuntu. Eu escrevo meu código no Gedit, é o simples projeto hello world. Eu vou para o terminal para executá-lo com gcc helloworld.cc e esta mensagem aparece:

/tmp/ccy83619.o: In function 'main':
helloworld.cc:(.text+0xa): undefined reference to 'std::cout'
helloworld.cc:(.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*)'
/tmp/ccy83619.o: In function '__static_initialization_and_destruction_0(int, int)':
helloworld.cc:(.text+0x3d): undefined reference to 'std::ios_base::Init::Init()'
helloworld.cc:(.text+0x4c): undefined reference to 'std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

O que significa e para onde vou a partir daqui?

    
por Tzikos 18.11.2017 / 21:58

1 resposta

5

Os programas C ++ precisam estar vinculados à biblioteca padrão C ++. Embora você possa vincular a biblioteca padrão manualmente, ou seja, gcc -o hello hello.cpp -lstdc++ , geralmente não é feito assim. Em vez disso, você deve usar g++ no lugar de gcc , que vincula libstdc++ automaticamente.

dado

$ cat hello.cpp
#include <iostream>

int main(void) { std::cout << "Hello world" << std::endl; return 0; }

então

$ gcc -o hello hello.cpp
/tmp/ccty9cjF.o: In function 'main':
hello.cpp:(.text+0xa): undefined reference to 'std::cout'
hello.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*)'
hello.cpp:(.text+0x14): undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
hello.cpp:(.text+0x1c): undefined reference to 'std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccty9cjF.o: In function '__static_initialization_and_destruction_0(int, int)':
hello.cpp:(.text+0x4a): undefined reference to 'std::ios_base::Init::Init()'
hello.cpp:(.text+0x59): undefined reference to 'std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

enquanto

g++ -o hello hello.cpp
$ ./hello
Hello world
    
por steeldriver 18.11.2017 / 22:20