#include <iostream>

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

int main() {}


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

最佳答案

默认情况下,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
$

10-02 09:33