奇怪的C编译器,出现错误"ld:重复符号_main"。

6

我刚开始学习C语言,写了一个hello world程序:

#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吗?


不行,我得到了完全相同的错误。 - Billjk
1
你所使用的命令行是什么来编译这段代码?很有可能,你的命令行包括了两个 .c 文件,并且它们都包含了 main 实现。具体而言,错误信息似乎表明你试图将 helloworld.cmain.c 编译成一个可执行文件。 - Adam Mihalcin
1
是的,我建议您在终端中使用编译器,clang helloworld.c 运行良好。 - llj098
2
这个问题为什么被踩了? - Billjk
这不是有效的 C 语言程序。你需要 int main(),而不是 main() - R.. GitHub STOP HELPING ICE
显示剩余2条评论
4个回答

14

如果你阅读错误消息(特别是以ld: duplicate symbol _main in ...开头的行),你会注意到它正在抱怨两个main函数,一个在:

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

另一个在:

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

这意味着您的项目出了点问题。可能是您有两个包含main函数的源文件,或者Xcode自动提供了其中一个。

您只需要解决这个问题。


太棒了,@paxdiablo,你帮我节省了时间。 - Jignesh Chanchiya

11

以下是如何解释这条消息:

Apple Mach-O Linker (id) 错误

出现了错误

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

这是 Xcode 执行链接步骤的命令。您几乎总是可以忽略它并跳过下一个空行。

ld:在 /Users/…/helloworld.o 和 /Users/…/main.o 中找到了重复的符号 _main,用于架构 x86_64

这是实际的错误消息。它告诉您在文件 helloworld.omain.o 中都有重复的 _main 符号。这意味着您有两个都被称为 main 的函数,这是不允许的。其中一个位于 helloworld.c 中,另一个位于 main.c 中。如果您删除其中一个函数或文件,则错误将消失。

/Developer/usr/bin/clang 命令执行失败,退出码为 1

这告诉您 Xcode 执行的命令的退出代码。它比错误消息 less 有用,我从未见过除了连接错误以外的其他退出代码。


10

我也遇到过这个问题。在“目标成员资格”中,只需选择要运行的文件。取消其他您不想运行的文件的勾选。然后再尝试一次。

输入图像描述


这对我有用,我取消选中除了与main.c相关的目标文件之外的所有目标文件。谢谢。 - xslittlegrass
这对我也有效,但我意识到更好的解决方案是从同一个文件夹中删除所有对象(.o)文件。它们导致了重复,如果您想调试其他.c文件,则不应删除它们的成员资格。 - Thorsten Lorenz

3

需要记住的是,如果你有一个#include "...filename..."导致函数调用出现了重复副本,那么你也可能会收到这个错误消息。然而,在你的情况下,这种情况不太可能发生。

请记住,#include本质上只是在它的位置处复制和粘贴你的代码副本。


2
Alex,你的答案帮了我,我导入了viewController.m文件而不是viewController.h文件。 - Peer Mohamed Thabib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接