代码之家  ›  专栏  ›  技术社区  ›  nagul

程序在g++中编译,但在gcc中退出时出现链接器错误

  •  3
  • nagul  · 技术社区  · 15 年前

    我正在尝试 solution 到A question about specialized template classes .

    这个带有a的代码在g++中编译得很好,但是在用gcc编译时会抛出链接器错误。这些错误的原因是什么?

    $ 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
    

    traits2.ccp文件包含上述 解决方案 使用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;
    }
    
    3 回复  |  直到 13 年前
        1
  •  15
  •   anon    15 年前

    当使用GCC编译时,默认情况下不链接C++库。总是用G++构建C++代码。

        2
  •  6
  •   BatchyX    15 年前

    如果您想自己看到不同之处,请尝试使用带有-v标志的两个版本

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

    这将显示代码顶部可执行文件中的每个步骤,包括添加的库。

        3
  •  0
  •   Nick Meyer    15 年前

    你的代码是C++,所以它必须用G++编译,C++编译器,而不是GCC,C编译器。