2012-08-07 13 views
23

tutto, scrivo un codice come questo nel mio mac os x 10.8 e quando uso "gcc use_new.cpp -o use_new" per compilarlo , ma lancia un messaggio sbagliato in questo modo:gcc 4.8 su MAC OS X 10.8 genera "Simboli indefiniti per architettura 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 

e quando uso "g ++ -o use_new.cpp use_new" va bene, che mi può aiutare !? grazie!

#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

Sto riscontrando un problema simile con 'i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1', cercando di compilare un programma" Hello world ". Taglie avviate. – Randomblue

+2

Questo è stato chiesto in un modo o nell'altro tante volte (per esempio [qui] (http://stackoverflow.com/questions/5590983/problem-occurred-while-compiling-a-cpp-program-in-gcc) , [qui] (http://stackoverflow.com/questions/1221902/programs-compiles-in-g-but-exits-with-linker-errors-in-gcc?rq=1) o [qui] (http: //stackoverflow.com/questions/8904722/gcc-linker-cant-find-standard-library)). Trarrai vantaggio dalla lettura [Qual è la differenza tra g ++ e gcc?] (Http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc). – Troubadour

risposta

5

La risposta a questa domanda StackOverflow ha la risposta

gcc and g++ linker

Usa

gcc -lstdc++ use_new.cpp -o use_new 

La bandiera -lstdc++ dice al linker di includere la libreria C++ standard

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

che sto con Mac OS X 10.7.4 e la biblioteca si trova qui

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

Grazie; che funzioni. Potresti per favore elaborare la bandiera? – Randomblue

+0

Indica al linker di includere la libreria standard C++, risposta modificata per includerla. – amdn

66

Questo è il caso anche con il vecchio 4.2 GCC (ho sperimentato questo quando ho impostato il mio non ufficiale toolchain iOS). gcc assume C di default e richiama il linker senza collegarsi alla libreria standard C++; al contrario, g++ assume C++ e collegamenti alla libreria standard C++ per impostazione predefinita.

Tutto sommato - possibili soluzioni:

gcc myprog.c -o myprog -lstdc++ 

o

g++ myprog.c -o myprog 
+0

Capisco. Consiglieresti di utilizzare una versione più recente di GCC? – Randomblue

+0

@Randomblue non esiste una versione più recente di GCC, anche 4.8 è in fase di sviluppo. Usa '-lsdtC++' per il collegamento, o meglio (ti consiglio di farlo): usa g ++ per il collegamento. –

+0

Grazie per la taglia. –

3

Questo non è correlato al codice incollato da @ user1582840 solo i miei 2 centesimi, e da una diversa causa del lo stesso problema in g ++ quando si lavora su parte del mio codice:

Ho ricevuto l'errore "ld: simbolo (i) non trovato per architettura x86_64" quando si utilizza g ++ 4.2.1 su OS X 10.8/Darwin11 per un diverso ragione Speriamo che questo aiuti alcuni alla ricerca di Google per il problema.

Ho ricevuto questo errore perché avevo definito una classe, nella definizione della classe che ho dichiarato funzioni membro. Tuttavia, quando ho definito le funzioni membro ho dimenticato di includere il modificatore di classe.

Così, per un esempio di cosa sto parlando (esempio di codice, non il programma completo):

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

poi più tardi, quando si definisce il costruttore NewClass() (o qualsiasi funzione membro) ho semplicemente avuto :

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

piuttosto che:

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

Questo è un piuttosto semplice errore, e sono riuscito t o prendilo per un po 'di tempo per fortuna, ma potrebbe essere facile per qualcuno perdere (noi neofiti in particolare) e le soluzioni sui linker gcc/g ++, XCode, ecc.non sono d'aiuto per questo: P

Ancora, spero che aiuti!

Problemi correlati