2012-03-27 138 views
5

我剛開始學習C,並且寫了我的Hello World程序:奇怪的C編譯器,得到一個錯誤「LD:重複的符號_main」

#include <stdio.h> 
main() 
{ 
    printf("Hello World"); 
    return 0; 
} 

當我運行代碼,我得到一個非常長的錯誤:

Apple Mach-O Linker (id) Error 

Ld /Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Products/Debug/CProj normal x86_64 
     cd /Users/Solomon/Desktop/C/CProj 
     setenv MACOSX_DEPLOYMENT_TARGET 10.7 
     /Developer/usr/bin/clang -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.7.sdk -L/Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Products/Debug -F/Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Products/Debug -filelist /Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Intermediates/CProj.build/Debug/CProj.build/Objects-normal/x86_64/CProj.LinkFileList -mmacosx-version-min=10.7 -o /Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Products/Debug/CProj 

    ld: duplicate symbol _main in /Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Intermediates/CProj.build/Debug/CProj.build/Objects-normal/x86_64/helloworld.o and /Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Intermediates/CProj.build/Debug/CProj.build/Objects-normal/x86_64/main.o for architecture x86_64 
    Command /Developer/usr/bin/clang failed with exit code 1 

我正在運行的Xcode

我應該重新安裝DevTools?

+0

不,我得到相同的確切錯誤 – Billjk 2012-03-27 01:43:13

+1

你用來編譯這段代碼的命令行是什麼?很有可能,你的命令行包含兩個包含'main'實現的.c文件。具體來說,錯誤消息似乎表明您正試圖將'helloworld.c'和'main.c'編譯成一個可執行文件。 – 2012-03-27 01:45:16

+0

您正在鏈接兩個聲明main()的不同文件。查看下面的內容,看看是否有任何不屬於的鏈接文件:/Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Intermediates/CProj.build/Debug/CProj.build/對象-normal/x86_64/CProj.LinkFileList – 2012-03-27 01:45:40

回答

14

如果閱讀的錯誤信息(尤其是行開始ld: duplicate symbol _main in ...),你會發現,它的抱怨約兩main功能,一是在:

......blah blah blah/helloworld.o 

和其他在:

......yada yada yada/main.o 

這意味着您的項目被搞亂了。要麼你有兩個獨立的源文件,其中包含main,或者Xcode自動提供一個源文件。

你只需要解決這個問題。

+0

偉大的答案@paxdiablo,你節省了我的時間。 – 2015-05-14 12:56:20

12

下面是如何解釋的消息:

Apple Mach-O Linker (id) Error

出錯

Ld /Users/ …
cd …
setenv …
/Developer/…

這是Xcode中執行,以執行鏈接步驟的命令。您幾乎總是可以忽略它並跳過下一個空白行。

ld: duplicate symbol _main in /Users/…/helloworld.o and /Users/…/main.o for architecture x86_64

這是實際的錯誤信息。它告訴你,你有_main符號,helloworld.omain.o。這意味着您必須使用被稱爲main的功能,這是不允許的。其中一個在helloworld.c,另一個在main.c。如果您刪除這些功能或文件之一,錯誤將消失。

Command /Developer/usr/bin/clang failed with exit code 1

這告訴你Xcode執行的命令的退出代碼。它比錯誤信息更有幫助,並且我從來沒有看到除鏈接錯誤之外的任何內容。

10

我也遇到了這個問題。在「目標成員」中,只需勾選您想要運行的文件即可。在其他你不想運行的文件中解開它。然後再試一次。

enter image description here

+0

這適用於我,取消選中與main.c關聯的文件之外的所有目標文件。謝謝。 – xslittlegrass 2013-01-03 16:07:26

+0

這也適用於我,但我意識到更好的解決方案是從同一個文件夾中刪除所有對象(.o)文件。它們導致重複,如果您想調試其他.c文件,則不應刪除其成員資格。 – 2013-10-15 22:55:35

2

同樣重要的是要記住,你可能會收到此錯誤信息,如果你有一個#include "...filename..."創建你的函數調用的副本。但是,就你而言,這不太可能。

請記住,#include基本上只是複製並粘貼您的代碼的副本,其中#include發生。

+1

亞歷克斯你的答案幫助我,我已經導入我的viewController.m而不是viewController.h文件 – 2014-03-07 05:17:19