未使用的变量和函数的链接器错误

时间:2014-07-03 11:25:42

标签: c++ c gcc linker-errors cl

我写了以下测试程序

int proc1();
extern int globalvar;

int func1 ()
{
    return globalvar + 1;
}

int func2()
{
    return proc1()+3;
}

int main()
{
    return 0;
}

正如您所看到的,该程序没有做任何事情。但是,在编译时,我遇到了globalvarint proc1()的链接器错误,尽管事实上它们不会从入口点函数main引用。 我在Windows(使用cl)和Linux(使用gcc)上遇到问题。

有没有办法指示编译器/链接器不要从入口点(在cl,gcc和clang上)链接这个未引用的全局变量和函数?

Windows上的确切错误消息:

test.obj : error LNK2019: unresolved external symbol "int globalvar" (?globalvar@@3HA) referenced in function "int __cdecl func1(void)" (?func1@@YAHXZ)
test.obj : error LNK2019: unresolved external symbol "int __cdecl proc1(void)" (?proc1@@YAHXZ) referenced in function "int __cdecl func2(void)" (?func2@@YAHXZ)
test.exe : fatal error LNK1120: 2 unresolved externals

1 个答案:

答案 0 :(得分:1)

您可以在gcc中修复此问题,如下所示:

gcc -ffunction-sections -Wl,--gc-sections test.c

这有两件事:

  1. 它指示编译器在二进制文件中的自己的“section”中发出每个函数。

  2. 它指示链接器丢弃(垃圾收集)未引用的部分。

  3. 这意味着func1func2将被丢弃,因此不会再引用globalvarproc1