#include <iostream>
struct CL1
{
virtual void fnc1();
virtual void fnc2(); //not defined anywhere
};
void CL1::fnc1(){}
int main() {}
这会在fnc2上给出未定义的引用错误,但它不会在任何地方使用。为什么会这样?我尝试在Visual Studio上执行此操作,然后将其成功链接。
答案 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
$