2009-08-03 10 views
3

Ich probiere die solution zu einem question about specialized template classes.Programme kompiliert in g ++ aber endet mit Linker-Fehler in gcc

Dieser Code mit einer Kompilierung in g ++, aber wirft Linker-Fehler, wenn mit gcc kompiliert. Was ist die Ursache für diese Fehler?

$ g++ traits2.cpp 
$ gcc traits2.cpp 
/tmp/ccI7CNCY.o: In function `__static_initialization_and_destruction_0(int, int)': 
traits2.cpp:(.text+0x36): undefined reference to `std::ios_base::Init::Init()' 
traits2.cpp:(.text+0x3b): undefined reference to `std::ios_base::Init::~Init()' 
/tmp/ccI7CNCY.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' 
collect2: ld returned 1 exit status 

Die traits2.ccp Datei enthält die zuvor erwähnte solution mit einem emtpy main() Funktion:

#include <iostream> 

using namespace std; 

// A default Traits class has no information 
template<class T> struct Traits 
{ 
}; 

// A convenient way to get the Traits of the type of a given value without 
// having to explicitly write out the type 
template<typename T> Traits<T> GetTraits(const T&) 
{ 
    return Traits<T>(); 
} 

template <int major, int minor> struct A 
{ 
    void f() 
    { 
     cout << major << endl; 
    } 
}; 

// Specialisation of the traits for any A<int, int> 
template<int N1, int N2> struct Traits<A<N1, N2> > 
{ 
    enum { major = N1, minor = N2 }; 
}; 

template <> struct A<4,0> 
{  
    void f() 
    { 
     cout << "Specialized:" << GetTraits(*this).major << endl; 
    } 
}; 

int main(int argc, char * argv[]) 
{ 
    /* 
    A<4,0> p; 
    A<1,2> p2; 
    p.f(); 
    p2.f(); 
    */ 
    return 1; 
} 

Antwort

15

Wenn Sie mit gcc kompilieren, sind die C++ - Bibliotheken standardmäßig nicht verknüpft. Erstellen Sie immer C++ - Code mit g ++.

+0

Gcc sollte nicht automatisch den C++ - Compiler für .cpp-Dateien aufrufen: http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc? – nagul

+6

Ja, aber es verbindet die C++ - Bibliotheken nicht. Ihr Problem ist das Verknüpfen, nicht das Kompilieren. –

+4

Sie können -lstdC++ mit gcc verwenden, um die Standardbibliotheken und die Laufzeit zu erhalten, die verknüpft sind (gcc -lstdC++ my.cpp). –

0

Der Code ist C++, so dass es mit g kompiliert werden müssen ++, die C++ Kompilierer nicht gcc , der C-Compiler.

+3

Sie können C++ - Code mit gcc kompilieren, aber es wird nicht automatisch für Sie verknüpfen. –

+0

Sie können -lstdC++ mit gcc verwenden, um die Standardbibliotheken und die Laufzeit zu erhalten, die in (gcc-lstdC++ my.cpp) verknüpft sind. –

6

Wenn Sie selbst den Unterschied zu sehen, versuchen beide Versionen mit der Option -v

$ g++ -v traits2.cpp 
$ gcc -v traits2.cpp 

Dies Sie die einzelnen Schritte von Code oben ausführbaren zeigen werden, einschließlich der Bibliotheken, die hinzugefügt werden.

Verwandte Themen