奇怪的链接行为,最新的g ++

Jul*_*.M. 1 c++ linker gcc g++

我一直在与g ++遇到奇怪的链接行为,但是,我只是一个学生,我想知道这是否正常.

我试图将汇编代码(机器:fedora 14 gnome 32bits x86 i686 intel i7)与c ++代码链接,并使汇编代码从c ++文件中实例化的函数调用方法.似乎在类声明中实现一个方法会阻止它被放入链接器表中,除非它在原始源中至少使用过一次.

class A
{
public:
    void showSUP() {
        cout<<"sup";
    }
};
Run Code Online (Sandbox Code Playgroud)

实例化后A,您将无法调用,_ZN1A7showSUPEv因为它尚未放入链接表中:

call _ZN1A7showSUPEv
Run Code Online (Sandbox Code Playgroud)

但是,如果在A声明的.cpp中调用A :: showSUP(),则从单独的程序集文件中调用它将起作用.

随着(和实例化A)

class A
{
    void showSUP();
};

A::showSUP()
{
    cout<<"sup";
}
Run Code Online (Sandbox Code Playgroud)

通话_ZN1A7showSUPEv将有效.

我的问题是,为什么第一个例子不起作用.

谢谢大家.

har*_*per 5

有一些属性,您可以通过这种方式为函数指定

classe A
{
  public:
    void showSUP(){
      cout<<"sup";
    } __attribute__((used))
};
Run Code Online (Sandbox Code Playgroud)

请参阅gcc属性概述

used在以下版本中找到:3.1-3.4描述:

     This attribute, attached to a function, means that code must be
     emitted for the function even if it appears that the function is
     not referenced.  This is useful, for example, when the function
Run Code Online (Sandbox Code Playgroud)

仅在内联汇编中引用.