【问题标题】:Xcode duplicate symbol _mainXcode重复符号_main
【发布时间】:2010-03-29 00:58:32
【问题描述】:

每当我尝试编译由 Appcelerator Titanium 生成的任何 iPhone 应用程序时,我都会在 Snow Leopard 10.6.2 上的 Xcode 3.2.1 中收到以下错误。但是,只有当我在架构菜单上选择 iPhone 模拟器时才会出现构建错误,如果我选择 iPhone 设备,我就可以在我的设备上运行该应用程序。

此外,iPhone 模拟器成功启动并直接从使用 Xcode 构建的 Titanium 环境执行程序。

为什么会这样?

ld: duplicate symbol _main in Resources/libTitanium.a(main.o) and /Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build/Objects-normal/i386/main.o collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

【问题讨论】:

    标签: iphone xcode titanium xcodebuild


    【解决方案1】:

    我无法告诉您为什么会发生这种情况,但我可以建议一种解决方法。当我注释掉为我的 Titanium 项目生成的 main.m 文件的全部内容时,我能够成功编译并在模拟器上运行。让我知道这是否适合你。

    【讨论】:

    • 澄清一下,您看到错误的原因是主 Titanium 库文件 libTitanium 包含一个 main 入口点,因此这对于 main 中的 main 函数是多余的。米。我不确定为什么这个问题不会在其他地方出现,但它一定与 Titanium 调用编译器的方式有关,它连接到它们的入口点而不是 main.m 中的入口点。
    • 就我而言,我正在使用的一个库有它自己的 main.m。注释掉并且有效
    • 虽然可行,但我认为这是处理此问题的正确方法:stackoverflow.com/questions/3380972/xcode-duplicate-symbol-main
    • 我对此没有异议。我想我去年在构建阶段方面的经验较少,这解释了我是如何忽略了明显的解决方案的。
    【解决方案2】:

    检查您的项目中是否有多个 main 函数声明。

    【讨论】:

      【解决方案3】:

      我只花了几个小时来解决这个问题。这是因为我使用了 -all_load 链接器标志。如果您使用该标志来解决类别错误,还有其他一些解决方案——请参阅here

      【讨论】:

      • stackoverflow.com/questions/932856/…,链接建议使用-ObjC。
      • 这是我们项目中的原因。这是一个使用 -all_load 的旧项目,我们只是在其中链接了一个新库。结果是 200 多个重复项。删除 -all_load 修复了它。
      【解决方案4】:

      我遇到了类似的问题。我的构建中意外包含了一个单元测试类。如果您在项目中搜索“main(”,您可能会发现重复的函数。

      【讨论】:

        【解决方案5】:

        这发生在我身上有两个原因:

        1:A 类调用 B 类并且两者都导入了相同的类。通过在 .m 文件中导入类来修复它。

        2:两个类有一个同名的常量(即使常量是在 .m 文件中定义的)。通过更改常量的名称来修复它。

        【讨论】:

          【解决方案6】:

          我遇到了这个问题,因为我这样定义了一个文件:

          @UIApplicationMain
          class AppDelegate: UIResponder, UIApplicationDelegate {
          ... 
          } 
          

          还有一个文件 main.m:

          int main(int argc, char* argv[])
          {
              @autoreleasepool {
                  int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
                  return retVal;
              }
          }
          

          【讨论】:

            【解决方案7】:

            似乎有多种方法可以进入这种状态。我的不一样。我读到了一个提示,您可以在其中将 .xib 事件选择器拖到视图控制器的 .h 实现中,它会自动生成您的方法。它做到了——这很酷。我立即开始收到重复的符号错误 - 这并不酷。

            我没有时间深入研究链接器以查看发生了什么。我创建了一个新的视图控制器,将我的旧 .xib 的上下文复制到新人中。删除了旧的 .h、.m 和 .xib 并构建,它再次工作。很奇怪,很烦人的时间浪费。

            这个xcode“方便”显然存在一些错误。

            【讨论】:

              【解决方案8】:

              当我有一个包含主函数的实现文件(比如 abc.m)并且还有另一个 main.m 时,我发现这种情况发生了。将abc.m中的main函数注释掉后,项目编译成功。

              【讨论】:

                【解决方案9】:

                根据我从这些其他答案中可以看出的情况,我将需要删除一堆 main 方法。

                但要轻松做到这一点,我首先需要从我的文件中删除所有 gd cmets,因为它们几乎每隔一行都用 cmets 认真记录

                此正则表达式匹配所有 C 多行 cmets,包括它们的分隔符,并且可以帮助您完成旅程

                /\*((?!\*/).)*\*/
                

                【讨论】:

                  【解决方案10】:

                  我花了一个多小时寻找正确的答案,但对我没有任何帮助。 最后,它自己告诉某些东西的xcode被复制了,所以转到那个特定的文件夹(在这种情况下:/Users/prithviraj/Documents/project/Final/build/iphone/build/Final.build/Debug-iphonesimulator/Final.build/ Objects-normal/i386/main.o) 并删除所有文件,并在项目中检查是否该特定类/接口被声明两次,如果是,则删除它。

                  删除后清理并运行项目。

                  它对我有用,希望对你有帮助(-_-)。

                  【讨论】:

                    【解决方案11】:

                    删除/Users/{username}/Library/Developer/Xcode/DerivedData 文件夹并重新构建。

                    【讨论】:

                      猜你喜欢
                      • 2011-03-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-05-18
                      • 2014-05-20
                      • 2016-02-03
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-10-20
                      相关资源
                      最近更新 更多