【问题标题】:Weird C Compiler, getting an error "ld: duplicate symbol _main"奇怪的 C 编译器,收到错误“ld:重复符号 _main”
【发布时间】:2012-04-10 13:18:13
【问题描述】:

我刚开始学习 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 吗?

【问题讨论】:

  • 不,我得到了同样的错误
  • 您用于编译此代码的命令行是什么?很有可能,您的命令行包含两个 .c 文件,它们都包含一个 main 实现。具体来说,错误消息似乎表明您正在尝试将helloworld.cmain.c 编译成一个可执行文件。
  • 您正在链接两个都声明 main() 的不同文件。查看以下内容以查看是否有任何不属于链接的文件:/Users/Solomon/Library/Developer/Xcode/DerivedData/CProj-cwosspupvengheeaapmkrhxbxjvk/Build/Intermediates/CProj.build/Debug/CProj.build/对象-normal/x86_64/CProj.LinkFileList
  • 是的,我建议你在终端中使用编译器,clang helloworld.c 效果很好
  • 这个问题被否决了吗?

标签: c xcode macos compiler-construction


【解决方案1】:

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

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

和其他在:

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

这意味着您的项目以某种方式搞砸了。要么你有两个包含 main 的单独源文件,要么 Xcode 自动提供一个。

你只需要解决这个问题。

【讨论】:

  • 很好的回答@paxdiablo,你节省了我的时间。
【解决方案2】:

以下是解释该消息的方法:

Apple Mach-O 链接器 (id) 错误

发生错误

Ld /Users/ …
光盘...
设置环境…
/开发者/…

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

ld:架构 x86_64 中 /Users/…/helloworld.o 和 /Users/…/main.o 中的重复符号 _main

这是实际的错误消息。它告诉您有重复的_main 符号,一个在文件helloworld.o 中,一个在main.o 中。这意味着您必须使用都称为main 的函数,这是不允许的。其中一个在helloworld.c,另一个在main.c。如果您删除其中一个函数或文件,错误就会消失。

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

这告诉你 Xcode 执行的命令的退出代码。它不如错误消息有用,而且我从来没有见过除了 1 之外的任何链接错误。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这对我有用,在我取消选中除与 main.c 关联的之外的所有目标文件之后。谢谢。
    • 这也适用于我,但我意识到更好的解决方案是从同一文件夹中删除所有对象 (.o) 文件。它们会导致重复,如果您想调试其他 .c 文件,则不应删除它们的成员资格。
    【解决方案4】:

    同样重要的是要记住,如果您有一个 #include "...filename..." 创建了您的函数调用的副本,您可能会收到此错误消息。但是,就您而言,这不太可能。

    请记住,#include 本质上只是在发生#include 的位置复制并粘贴您的代码副本。

    【讨论】:

    • Alex 你的回答帮助我导入了我的 viewController.m 而不是 viewController.h 文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2013-01-03
    相关资源
    最近更新 更多