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.