2012-03-27 104 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