未使用的变量和函数的链接器错误
Posted
技术标签:
【中文标题】未使用的变量和函数的链接器错误【英文标题】:Linker error of unused variable and function 【发布时间】:2014-07-03 11:25:41 【问题描述】:我已经编写了以下测试程序
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
【问题讨论】:
these are not going to be used in the program
- 那你觉得return globalvar + 1;
和return proc1() + 3;
怎么办?
@user3477950:查看编辑。这些不会被入口点函数 main 引用。
然后呢?他们的调用者不是static
,所以即使如果链接器执行LTO,它也不可能消除它们...
@user3477950:是不是因为这些功能可以在其他翻译单元中使用?但我只有一个翻译单元。
@dbasic 我认为您遇到了未定义的参考错误。在哪里定义 proc1()
函数。和globalvar
变量。
【参考方案1】:
您可以在gcc
中解决此问题,如下所示:
gcc -ffunction-sections -Wl,--gc-sections test.c
这有两件事:
它指示编译器在二进制文件的自己的“部分”中发出每个函数。
它指示链接器丢弃(垃圾收集)未引用的部分。
这意味着func1
和func2
将被丢弃,因此不会有更多对globalvar
或proc1
的引用。
【讨论】:
不知道,你才是真正使用这些工具的人。 ;-)以上是关于未使用的变量和函数的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
STM32 GNU ARM 链接器:使用 eclipse 对函数()的未定义引用