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

标签 c++ gcc linker g++

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

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

class A
{
public:
    void showSUP() {
        cout<<"sup";
    }
};

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

call _ZN1A7showSUPEv

但是,如果您在声明 A 的同一 .cpp 中调用 A::showSUP(),则可以从单独的程序集文件调用它。

与(和 A 的实例化)

class A
{
    void showSUP();
};

A::showSUP()
{
    cout<<"sup";
}

调用 _ZN1A7showSUPEv 会起作用。

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

提前谢谢大家。

最佳答案

有一些属性,你可以用这种方式为一个函数指定

classe A
{
  public:
    void showSUP(){
      cout<<"sup";
    } __attribute__((used))
};

参见 gcc attribute overview

used Found in versions: 3.1-3.4 Description:

     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

is referenced only in inline assembly.

关于c++ - 奇怪的链接行为,最新的 g++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5672104/

相关文章:

c++ - 在 Android 上使用 Boost.Log 进行 logcat

c - scanf仅交替工作

c++ - 使用 ncurses 和 cmake 链接期间 undefined reference

c++ - Makefile 更新库依赖

java - 如何在现代 Linux 中轻松制作图形?

c++ - LittleFS文件系统,NOR Flash的文件写入问题

c++ - 线程写入缓冲存储器和线程存储器

c++ - clang 如何引导 C/C++ 代码优化?

c - 是否有离线 MinGW 安装程序?

c++ - 使用 MinGW 编译 OpenGL 并出现过剩链接器错误