【问题标题】: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 变量。

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


【解决方案1】:

您可以在gcc 中解决此问题,如下所示:

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

这有两件事:

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

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

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

【讨论】:

  • 不知道,你才是真正使用这些工具的人。 ;-)
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多