2017-08-08 139 views
0

从我的理解,一个链接错误由于重复的符号是指:链接器错误:如何在一个文件中存在重复的符号?

  1. 一个符号在多个源文件
  2. 导致两个不同的目标文件相同的符号编译
  3. 之后被定义
  4. 所以链接器不知道他应该链接到哪两个符号。

尝试从www.ugfx.io我碰到这个错误来编译演示项目:

duplicate symbol _main in: 
    .build/obj/GFXLIB/demos/modules/gdisp/basics/main.o 
ld: 1 duplicate symbol for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [.build/demotest.elf] Error 1 

相较于每个复制的符号错误,我能找到在网络上只有一个文件列为此错误的一部分。而属于这个目标文件的源文件只有一个主要的符号。您可以查看它here

我该怎么理解这个错误?其原因是什么?

+0

有两种可能 - 要么同一个对象的代码被链接两次或源代码包含两次。 –

+0

也许有一个叫做''_main''和经典''int main(...)''的函数。编译器只是认为,_main与main不同,稍后它将“_”附加到stdcall函数和_forgets_以检查重复/将“_main”更改为另一个符号。 __So只需检查文件并尝试用另一个编译器编译并重新链接.__ – cmdLP

+0

也许[objdump](https://linux.die.net/man/1/objdump)[nm](https:/ /linux.die.net/man/1/nm)或[readelf](https://linux.die.net/man/1/readelf)可以提供帮助。也就是说,如果你在Linux上。 – Vroomfondel

回答

0

当我在编译命令中包含了两次相同的源文件时,发生了这种情况,例如, :

$gcc -o main main.c becool.c foo.c bar.c becool.c end.c 

重复的becool.c导致重复的符号错误。

所以,如果是这样的问题,只是审查你的编译命令并删除此类重复

+0

这不是一个答案。 – dbush

+0

澄清请@dbush – iBart

+0

你说的可能是问题,但没有足够的信息从OP来确定。作为评论更合适。 – dbush

相关问题