2011-09-23 16 views
37

Intento compilar este código cpp en osx lion pero me sale un error.Error al compilar un código simple de C++

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) 
{ 
    for(int i = 0; i < 10; i++) 
    { 
     cout << "hi"; 
     cout << endl; 
    } 

    return 0; 
} 

Recopilar:

cc main.cpp 

error:

Undefined symbols for architecture x86_64: 
    "std::cout", referenced from: 
     _main in ccBdbc76.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
     _main in ccBdbc76.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: 
     _main in ccBdbc76.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from: 
     _main in ccBdbc76.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccBdbc76.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in ccBdbc76.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
+4

Eso es un problema de vinculador. ¿Cómo estás vinculando? –

+0

Soy nuevo en cpp, realmente no entiendo tu pregunta. : –

+3

¿Qué instrucciones usó para compilar y vincular? ¿Qué compilador? –

Respuesta

76

Normalmente, este tipo de error ocurre al compilar su código C++ invocando el front-end de C. El gcc que ejecuta comprende y compila el archivo como C++, pero no lo vincula con las bibliotecas C++. Ejemplo:

$ gcc example.cpp 
Undefined symbols for architecture x86_64: 
    "std::cout", referenced from: 
     _main in ccLTUBHJ.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
     _main in ccLTUBHJ.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: 
     _main in ccLTUBHJ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from: 
     _main in ccLTUBHJ.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in ccLTUBHJ.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
$ g++ example.cpp 
$ 

Como se puede ver, el uso de g++ hace que los problemas desaparezcan. El mismo comportamiento (con un poco diferentes mensajes) se produce si utiliza clang (que recomiendo):

$ clang example.cpp 
Undefined symbols for architecture x86_64: 
    "std::ios_base::Init::~Init()", referenced from: 
     ___cxx_global_var_init in cc-IeV9O1.o 
    "std::ios_base::Init::Init()", referenced from: 
     ___cxx_global_var_init in cc-IeV9O1.o 
    "std::cout", referenced from: 
     _main in cc-IeV9O1.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: 
     _main in cc-IeV9O1.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
     _main in cc-IeV9O1.o 
    "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from: 
     _main in cc-IeV9O1.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
$ clang++ example.cpp 
$ 

Como se puede ver en el mensaje de error clang, podría utilizar -v para ver la invocación enlazador para ver que esta pasando mal Se le mostraría esta línea de enlace:

"/usr/bin/ld" -demangle -dynamic -arch x86_64 
    -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o 
    /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o 
    -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a 

O algo por el estilo - como se puede ver, se une el tiempo de ejecución de C, C++ no, y no tiene las librerías de C++. Usando clang++ la línea de enlace es:

"/usr/bin/ld" -demangle -dynamic -arch x86_64 
    -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o 
    /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o 
    /usr/lib/libstdc++.6.dylib -lSystem 
    /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a 

Como se puede ver, se incluye libstdc++, y listo - no hay errores de enlace.

+10

+1 por recomendar clang. –

+2

usando clang ++ trabajado. –

+2

¡Uy! Olvidé agregar mi archivo 'other.c' al argumento de los nombres de archivo del comando' clang'. Acabo de hacer 'clang main.c'. Haciendo 'clang main.c other.c' trabajado. (Tengo '#include" other.h "' en la parte superior de 'main.c'. – ma11hew28

3

No estoy familiarizado con OSX león. Sin embargo, en el sentido más estricto, los errores descritos no son causados ​​por el compilador, sino por el enlazador. Parece como si la biblioteca estándar no estuviese vinculada.

3

Utilice el comando CC (mayúsculas) para compilar C++ y vincular a la biblioteca estándar de C++.

0

¿Es este GCC en Windows (MinGW) o Linux? En MinGW necesita los parámetros -lmingw32 -enable-auto-import. Linux podría necesitar algo similar, lo más probable es -enable-auto-import.

+0

La pregunta del OP dice 'osx lion'. –

+0

Aparentemente no puedo leer -_- – Frigo

5

Trate

g++ main.cpp 

Esta forma en que debe funcionar, al menos usando OS X

1

A partir de Yosemite (10.10.1), he encontrado que gcc con la bandera -lc++ funciona también:

gcc -lc++ main.cpp 
0

Si se utiliza sonido metálico en OS X, intente:

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out 
1

Aquí está la solución que funciona en MacOS Sierra:

Hay dos implementaciones de la biblioteca estándar de C++ disponible en OS X: libstdC++ y libC++. No son compatibles con binarios y libMLi3 requiere libstdC++.

En 10.8 y anterior libstdC++ se elige de forma predeterminada, en 10.9 se elige libC++ de forma predeterminada. Para garantizar la compatibilidad con libMLi3, debemos elegir libstdC++ manualmente.

Para hacer esto, agregue -stdlib = libstdC++ al comando de enlace.

Cuestiones relacionadas