【问题标题】:Class Implemented in Two Places在两个地方实现的类
【发布时间】:2012-11-07 19:04:03
【问题描述】:

在 iOS5 模拟器上运行我的应用程序时,我有以下日志输出。两个位置都是一样的。对于属于 JSONKit 的几乎每个类,我都会收到以下错误。

Class JKSerializer is implemented in both /Users/myHomeDir/Library/Application Support/iPhone Simulator/5.0/Applications/33E6C55B-4883-48FF-BEFF-3FBA9C071CAB/MyApp.app/MyApp and /Users/myHomeDir/Library/Application Support/iPhone Simulator/5.0/Applications/33E6C55B-4883-48FF-BEFF-3FBA9C071CAB/MyApp.app/MyApp. One of the two will be used. Which one is undefined.

如果合适的话,我刚刚运行了一个复杂的合并,我宁愿不必恢复到以前的版本。

关于此错误如何发生、如何预防以及如何修复的任何想法?

【问题讨论】:

  • 你在使用 Cocoapods 吗?

标签: ios5 xcode4.5


【解决方案1】:

这是因为JSONKit.m 实现文件是多个目标的成员,并且其中一个目标已作为对另一个目标的依赖被包含在内。

例如,检查目标成员资格:

这里可以看到文件是Pods-UnitTestsPods的成员。

这反映了 Build Phases -> Compile Sources 中每个目标的设置。

成为两个目标的成员本身并不是问题。相反,问题是这些目标之一依赖于另一个。所以Pods-UnitTests 依赖于Pods。因此,当您检查单元测试的构建记录时,如果您搜索JSONKit.m,您会找到两次。一次用于 libPods.a,另一次用于单元测试目标。

如果您不使用 CocoaPods,那么解决方案就是删除 JSONKit.m 文件,使其只编译一次。

如果您使用的是 CocoaPods,那么我不确定解决方案是什么,因为尽管您不想编译该文件两次,但您无疑需要在单元测试代码中的某处导入标头。到目前为止,我不确定该怎么做。

以下是一些参考资料:

https://github.com/CocoaPods/CocoaPods/issues/115

Class Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined

http://sealedabstract.com/code/tired-of-getting-mach-o-linker-errors-when-unit-testing/

【讨论】:

  • 你在哪里发现 Pods-UnitTests 对 Pods 有依赖? AFAICS libPods-UnitTests.a 未链接到 libPods.a 此外,如果是这种情况,您将收到重复符号错误。
  • 不确定我是否记得。可能来自对构建记录的详细查看。我认为这个问题是由 Cocoapods 中一个尚未解决的问题引起的。不确定重复的符号。设置链接与运行时有什么关系?
【解决方案2】:

检查 JSONKit 是否在您链接的第三方库中。

有一篇详细的帖子描述了how to debug这个问题。

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多