2009-08-03 6 views
3

J'essaie le solution en question about specialized template classes.Les programmes se compilent en g ++ mais se termine avec des erreurs d'éditeur de liens dans gcc

Ce code compile une fine en g ++, mais génère des erreurs de liens lors de la compilation avec gcc. Quelle est la cause de ces erreurs?

$ 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 

Le fichier traits2.ccp contient le solution précité avec une fonction main() emtpy:

#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; 
} 

Répondre

15

Lorsque vous compilez avec gcc, les bibliothèques C++ ne sont pas liées par défaut. Construisez toujours du code C++ avec g ++.

+0

Gcc n'est pas censé invoquer automatiquement le compilateur C++ pour les fichiers .cpp: http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc? – nagul

+6

Oui, mais cela ne lie pas les bibliothèques C++. Votre problème est avec la liaison, pas la compilation. –

+4

Vous pouvez utiliser -lstdC++ avec gcc pour obtenir les bibliothèques standard et l'exécution liées (gcc -lstdC++ my.cpp). –

0

Votre code est C++, de sorte qu'il doit être compilé avec g ++, le compilateur C++, non gcc , le compilateur C

+3

Vous pouvez compiler du code C++ avec gcc, mais il ne liera pas automatiquement pour vous. –

+0

Vous pouvez utiliser -lstdC++ avec gcc pour obtenir les bibliothèques standard et le runtime liés (gcc -lstdC++ my.cpp). –

6

Si vous voulez voir la différence pour vous-même, essayez les deux versions avec le drapeau -v

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

Cela vous montrera chacune des étapes de l'exécutable supérieur de code, y compris les bibliothèques qui sont ajoutés.

Questions connexes