referencia indefinida a 'std :: cout'

194

¿Será este el ejemplo?

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

Lanza el error:

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

Además, este ejemplo:

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

arroja el error:

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

D1X
fuente
158
Intenta en g++lugar de gcc. gcces para C y no le dará acceso a la biblioteca estándar de C ++.
juanchopanza
2
Bueno, eso definitivamente resolvió el problema. Según tengo entendido, GCC es el acrónimo de Gnu Compiler Collection. ¿No debería llamar al compilador de g ++ cuando sea necesario? Por lo que el gcc comando llama al compilador de C en lugar ...
D1X
1
@ D1X es porque invocaste el enlazador por separado del compilador. cuando escribe gcc -o edit main.ono sabe que main.ova a necesitar bibliotecas de inicio de C ++.
MM
44
P: ¿No debería llamar al compilador de g ++ cuando sea necesario? R: No más de gcc debería llamar a gfortran, gjc, ... etc. etc. según sea necesario.
paulsm4

Respuestas:

275

Compila el programa con:

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

como coutestá presente en la biblioteca estándar de C ++, que necesitaría un enlace explícito con-lstdc++ cuando se usa gcc; g++enlaza la biblioteca estándar por defecto.

Con gcc, ( g++debe preferirse a gcc)

gcc main.cpp -lstdc++ -o main.o
shauryachats
fuente
11
Se puede usar para compilar código C ++, lo que pasa es que no se vincula con la biblioteca C ++. gccfuncionará bien si solo agrega -lstdc++.
Algún tipo de programador el
3
Incluya siempre -Wallal dar ejemplos de línea de comandos de gcc / g ++: ayuda a que los novatos adquieran buenos hábitos en una etapa temprana y ahorra tiempo a todos más adelante. ;-)
Paul R
44
¿Desde cuándo iostreams es std::coutparte de la Biblioteca de plantillas estándar?
TC
1
¿Por qué se necesita -Werror? He revisado la documentación y, si lo entiendo bien, cometeré errores de advertencia y hará que mis proyectos sean menos fáciles de compilar.
D1X
77
@ D1X: Porque existe una mala costumbre entre los programadores de ignorar las advertencias. Prácticamente todo lo que -Walle incluso -Wextraadvierte es un problema muy real o una codificación descuidada que se puede solucionar fácilmente. El mensaje aquí es adquirir un hábito en el que consideres que las advertencias del compilador son un indicador útil para mejorar tu código, en lugar de una molestia. Aquí hay cientos de preguntas sobre SO que no habrían sido necesarias en primer lugar si el OP hubiera utilizado -Wall -Wextra. -Werrores simplemente reforzar eso.
DevSolar
42

Sí, usar el g++comando funcionó para mí:

g++ my_source_code.cpp
AB
fuente
a continuación, ejecutar con./a.out
kaleidawave
2

Makefiles

Si está trabajando con un archivo MAKE y terminó aquí como yo, entonces esto es probablemente lo que está buscando o:

Si está utilizando un archivo MAKE, debe cambiarlo cccomo se muestra a continuación

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

a

CC = g++

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