Les programmes sont compilés en g ++ mais se terminent avec des erreurs de l'éditeur de liens en gcc

StackOverflow https://stackoverflow.com/questions/1221902

  •  10-07-2019
  •  | 
  •  

Question

J'essaie la solution à une question sur les classes de modèles spécialisées .

Ce code avec une compilation fine en g ++, mais génère des erreurs d’éditeur de liens lorsqu’il est compilé 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 les éléments susmentionnés solution avec une fonction vide emtpy main ():

#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;
}
Était-ce utile?

La solution

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

Autres conseils

Si vous voulez voir la différence par vous-même, essayez les deux versions avec l'indicateur -v

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

Ceci vous montrera chacune des étapes du code de l'exécutable principal, y compris les bibliothèques ajoutées.

Votre code est C ++, il doit donc être compilé avec g ++, le compilateur C ++, pas gcc, le compilateur C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top