海湾合作委员会:关于未使用的功能的奇怪的未解决的参考

时间:2015-11-08 17:20:01

标签: c++ gcc vtable

#include <iostream>

struct CL1
{
    virtual void fnc1();
    virtual void fnc2(); //not defined anywhere
};
void CL1::fnc1(){}

int main() {}

这会在fnc2上给出未定义的引用错误,但它不会在任何地方使用。为什么会这样?我尝试在Visual Studio上执行此操作,然后将其成功链接。

1 个答案:

答案 0 :(得分:1)

gcc在链接时默认不删除未使用的符号, 所以对于具有虚函数的类,它会生成虚拟表, 使用指向每个虚函数的指针,并将此表移动到.rodata部分, 所以你应该收到这样的错误信息:

g++ test10.cpp
/tmp/cc5YTcBb.o:(.rodata._ZTV3CL1[_ZTV3CL1]+0x18): undefined reference to `CL1::fnc2()'
collect2: error: ld returned 1 exit status

您可以启用垃圾收集和链接时间,但不会收到 和错误:

$ g++ -O3 -O3 -fdata-sections -ffunction-sections -fipa-pta test10.cpp -Wl,--gc-sections -Wl,-O1 -Wl,--as-needed
$