2012-08-07 11 views
23

todos, escribo un código como este en mi mac os x 10.8, y cuando uso "gcc use_new.cpp -o use_new" para compilarlo , pero lanza un mensaje erróneo de esta manera:gcc 4.8 en MAC OS X 10.8 arroja "Símbolos indefinidos para la arquitectura x86_64:"

Undefined symbols for architecture x86_64: 
    "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 ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(void const*)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(unsigned long)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o 
    "std::ios_base::Init::~Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o 
    "std::cout", referenced from: 
     _main in ccr2vrRQ.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 ccr2vrRQ.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 ccr2vrRQ.o 
    "operator delete(void*)", referenced from: 
     _main in ccr2vrRQ.o 
    "operator new(unsigned long)", referenced from: 
     _main in ccr2vrRQ.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

y cuando uso "g ++ use_new.cpp -o use_new" está bien, que me puede ayudar !? ¡gracias!

#include <iostream>  
    struct fish    
    { 
     float weight; 
     int id; 
     int kind;    
    }; 
    int main()    
    { 
     using namespace std; 
     int* pt = new int;  
     *pt = 1001;    
     cout<<"int: "<<*pt<<"in location: "<<pt<<endl; 
     double* pd = new double; 
     *pd = 100000001.0;  
     cout<<"double: "<<*pd<<"in location: "<<pd<<endl; 
     cout<<"int point pt is length "<<sizeof(*pt)<<endl; 
     cout<<"double point pd is length "<<sizeof(*pd)<<endl; 
     delete pt;    
     delete pd;    
     cout<<(int *)"How are you!"<<endl; 
     return 0; 
    } 
+0

Tengo un problema similar con 'i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1', tratando de compilar un programa de" Hola mundo ". Comenzó generosidad. – Randomblue

+2

Esto se ha pedido de una forma u otra tantas veces (por ejemplo [aquí] (http://stackoverflow.com/questions/5590983/problem-occurred-while-compiling-a-cpp-program-in-gcc) , [aquí] (http://stackoverflow.com/questions/1221902/programs-compiles-in-g-but-exits-with-linker-errors-in-gcc?rq=1) o [aquí] (http: //stackoverflow.com/questions/8904722/gcc-linker-cant-find-standard-library)). Te beneficiarías al leer [¿Cuál es la diferencia entre g ++ y gcc?] (Http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc). – Troubadour

Respuesta

5

La respuesta a esta pregunta StackOverflow tiene la respuesta

gcc and g++ linker

Uso

gcc -lstdc++ use_new.cpp -o use_new 

La bandera -lstdc++ le dice al enlazador para incluir la biblioteca C++ estándar

http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library

estoy ejecutando Mac OS X 10.7.4 y la biblioteca se encuentra aquí

/usr/lib/libstdc++.dylib 
+0

Gracias; eso funciona. ¿Podrías por favor elaborar sobre la bandera? – Randomblue

+0

Le dice al vinculador que incluya la biblioteca estándar de C++, que responde editada para incluir eso. – amdn

66

Este es el caso incluso con el antiguo 4.2 GCC (experimenté esto cuando creé mi extraoficial cadena de herramientas iOS) gcc asume C de manera predeterminada e invoca el vinculador sin vincularlo a la biblioteca estándar de C++; en cambio, g++ asume C++ y los enlaces contra la biblioteca estándar de C++ de forma predeterminada.

Con todo - soluciones posibles:

gcc myprog.c -o myprog -lstdc++ 

o

g++ myprog.c -o myprog 
+0

Ya veo. ¿Recomendarías usar una versión más reciente de GCC? – Randomblue

+0

@Randomblue no hay una versión más reciente de GCC, incluso 4.8 está en desarrollo. O use '-lsdtC++' para vincular, o mejor (le aconsejo que haga eso): use g ++ para enlazar. –

+0

Gracias por la recompensa. –

3

Esto no está relacionado con el código pegado por @ user1582840 sólo mis 2 centavos, y de una causa diferente de la mismo problema en g ++ cuando trabajo en algunos de mi propio código:

Recibí el error "ld: símbolo (s) no encontrado (s) para la arquitectura x86_64" cuando uso g ++ 4.2.1 en OS X 10.8/Darwin11 para una diferencia razón ent. Espero que esto ayude a algunos a buscar el problema en google.

Recibí este error porque tenía una clase definida, en la definición de clase declare las funciones de miembro. Sin embargo, cuando definí las funciones de miembro, olvidé incluir el modificador de clase.

lo tanto, para un ejemplo de lo que estoy hablando (ejemplo de código, no el programa completo):

class NewClass 
{ 
    NewClass(); // default constructor 
}; 

, posteriormente, al definir el constructor NewClass() (o cualquier función miembro) simplemente tenía :

// don't do this, it will throw that error!! 
NewClass() 
{ 
    // do whatever 
} 

en lugar de:

// proper way 
NewClass::NewClass() 
{ 
    // do whatever 
} 

Este es un lugar simple error, y he conseguido t o atraparlo en un corto período de tiempo afortunadamente, pero podría ser fácil que alguien se pierda (especialmente los novatos), y las soluciones sobre los enlazadores gcc/g ++, XCode, etc.no son de ninguna ayuda para esto: P

De nuevo, ¡espero que ayude!

Cuestiones relacionadas