2017-08-08 135 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

相關問題