【发布时间】:2011-04-15 03:31:45
【问题描述】:
我在使用 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 可以。
我的问题是,为什么第一个示例不起作用。
提前谢谢大家。
【问题讨论】:
-
听起来你的编译器忽略了未使用的函数。快速谷歌搜索虽然看起来像 -Wunused-function 会警告这一点,但没有关于省略的内容。很奇怪。
-
我猜是类里面的函数定义是内联的。
-
@wjlafrance:不,这并不奇怪。稍加了解,应该是可以预料的。由于该函数是在类声明中定义的,因此在编译任何使用它时它的定义都将清晰可见,并且编译器可以在多个模块中看到它的定义。由于不同模块的编译是独立的,编译器无法判断它是否会从另一个模块中获取编译后的代码,并且必须在所有模块中生成它并在链接期间将它们合并。为了避免浪费资源,它只在使用的地方生成。
-
@Jan Hudec 感谢您的澄清。 +1!