-1

我写了以下测试程序

int proc1();
extern int globalvar;

int func1 ()
{
    return globalvar + 1;
}

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

int main()
{
    return 0;
}

正如你所看到的,这个程序没有做任何事情。然而,在编译它时,我遇到了链接器错误,globalvar尽管int proc1()事实上这些不会被入口点函数引用maincl我在 Windows(使用)和 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
4

1 回答 1

1

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

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

这有两件事:

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

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

这意味着func1andfunc2将被丢弃,因此不会有更多对globalvaror的引用proc1

于 2014-07-03T11:37:49.750 回答