我写了以下测试程序
int proc1();
extern int globalvar;
int func1 ()
{
return globalvar + 1;
}
int func2()
{
return proc1()+3;
}
int main()
{
return 0;
}
正如您所看到的,该程序没有做任何事情。但是,在编译时,我遇到了globalvar
和int 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
答案 0 :(得分:1)
您可以在gcc
中修复此问题,如下所示:
gcc -ffunction-sections -Wl,--gc-sections test.c
这有两件事:
它指示编译器在二进制文件中的自己的“section”中发出每个函数。
它指示链接器丢弃(垃圾收集)未引用的部分。
这意味着func1
和func2
将被丢弃,因此不会再引用globalvar
或proc1
。