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

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;

如您所见,该程序没有执行任何操作。然而,在编译它时,我遇到了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

【问题讨论】:

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

这有两件事:

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

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

这意味着func1func2 将被丢弃,因此不会有更多对globalvarproc1 的引用。

【讨论】:

不知道,你才是真正使用这些工具的人。 ;-)

以上是关于未使用的变量和函数的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

链接器错误:未定义的函数引用

通过函数指针使用内部函数时的链接器错误

STM32 GNU ARM 链接器:使用 eclipse 对函数()的未定义引用

神秘的链接器错误

XE6 Ansi/Unicode 字符串链接器错误(未解决的外部问题)

链接器错误 - 未定义的符号