Saltar al contenido

Error al compilar un código simple de c ++

Esta noticia fue analizado por especialistas así aseguramos la exactitud de este ensayo.

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

$ gcc example.cpp 
Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccLTUBHJ.o
  "std::basic_ostream >& std::operator<<  >(std::basic_ostream >&, char const*)", referenced from:
      _main in ccLTUBHJ.o
  "std::basic_ostream >& std::endl >(std::basic_ostream >&)", referenced from:
      _main in ccLTUBHJ.o
  "std::basic_ostream >::operator<<(std::basic_ostream >& (*)(std::basic_ostream >&))", 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 puedes ver, usando g++ hace que los problemas desaparezcan. El mismo comportamiento (con mensajes ligeramente diferentes) ocurre si usa clang (que yo recomendaría):

$ 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 >& std::endl >(std::basic_ostream >&)", referenced from:
      _main in cc-IeV9O1.o
  "std::basic_ostream >& std::operator<<  >(std::basic_ostream >&, 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 puedes ver en el clang mensaje de error, podrías usar -v para ver la invocación del enlazador para ver qué va mal. Te 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 parecido, como puede ver, está vinculando el tiempo de ejecución de C, no C++, y tampoco tiene las bibliotecas de C++. Utilizando 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 puedes ver, libstdc++ está incluido, y listo, sin errores de enlace.

Tratar

g++ main.cpp

De esta manera debería funcionar, al menos usando OS X

No estoy familiarizado con OSX LION. 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 estuviera vinculada.

Te invitamos a confirmar nuestro estudio añadiendo un comentario o puntuándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *