【问题标题】:Xcode linker error writing Objective-CXcode链接器错误编写Objective-C
【发布时间】:2014-01-22 04:04:36
【问题描述】:

我的一个朋友让我尽可能用objective-c重写Box2D。我开始写作,到目前为止,当我构建项目时,我遇到了一些链接器错误,我以前遇到过类似的问题,但这没有帮助。我得到的错误是:

Ld /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Products/Debug/Obj-Box2D normal x86_64
    cd /Users/aizen-qa/Desktop/Obj-Box2D
    setenv MACOSX_DEPLOYMENT_TARGET 10.9
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -L/Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Products/Debug -F/Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Products/Debug -filelist /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Obj-Box2D.LinkFileList -mmacosx-version-min=10.9 -fobjc-arc -fobjc-link-runtime -framework Foundation -Xlinker -dependency_info -Xlinker /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Obj-Box2D_dependency_info.dat -o /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Products/Debug/Obj-Box2D

duplicate symbol _Ob2IsValid in:
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Vec3.o
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Mat22.o
duplicate symbol _Ob2InvSqr in:
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Vec3.o
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Mat22.o
duplicate symbol _Ob2IsValid in:
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Vec3.o
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Vec2.o
duplicate symbol _Ob2InvSqr in:
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Vec3.o
    /Users/aizen-qa/Library/Developer/Xcode/DerivedData/Obj-Box2D-bwsosdvwkjzsscahpbqrbrnzlall/Build/Intermediates/Obj-Box2D.build/Debug/Obj-Box2D.build/Objects-normal/x86_64/Ob2Vec2.o
ld: 4 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我读过类似的问题,并尝试了检查导入不使用.m和重复变量名等解决方案。但是我注意到向量的类具有相同的实例变量名称,x,y 所以这是我得到错误的原因吗?

【问题讨论】:

  • 好吧,试着做一个干净——当你遇到奇怪的错误时,标准的第一选择。
  • 您将矩阵和向量类命名为什么(在您的端口中)?
  • @HotLicks 我试过也没用
  • 会不会是 Ob2IsValid ... 是在 .h 文件而不是 .m 文件中定义的?如果 .h 文件包含在多个 .m 文件中,您会得到重复的定义。
  • 您是否真的检查过您的源文件以查看 _Ob2IsValid 等的声明位置/方式?在此处发布一些示例。

标签: objective-c xcode linker ld


【解决方案1】:

您在多个实现文件中定义而不是声明数据元素。这通常是因为包含的标头中的某些内容。

查找引用 Ob2InvSqr 或 Ob2IsValid 的位置,并确保这些项目的存储只完成一次。

【讨论】:

    【解决方案2】:

    文件 Ob2Vec2.o 和 Ob2Vec3.o 包含相同的符号 _Ob2InvSqr

    这很可能意味着您在同一个目标中同时拥有 Ob2Vec2.m 和 Ob2Vec3.m。

    确保只有一个被真正编译

    【讨论】:

      【解决方案3】:

      我猜你的一个头文件中有一个内联函数 _Ob2IsValid(...) 没有被内联(它太大了吗?)

      如果是这种情况,您可以像这样强制它内联:

      __attribute__((always_inline)) inline void MyFunction(...) {}
      

      或者只是让它脱线

      【讨论】:

        【解决方案4】:

        感谢 MartinR 的评论表,我能够解决这个问题。这是因为我在一个包含在多个 Objective-C 类中的 .h 文件中定义了一个函数。所以我所做的就是将函数头放在 .h 文件中,并将其实现放在 .m 文件中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-19
          • 1970-01-01
          • 2013-11-10
          • 1970-01-01
          • 2010-11-25
          • 1970-01-01
          • 1970-01-01
          • 2012-03-09
          相关资源
          最近更新 更多