ios - 使用 Cocoapods 构建静态库时防止重复符号

标签 ios objective-c static-libraries cocoapods

虽然我见过很多关于 Cocoapods 和静态库的问题,但大多数问题似乎都假定您最终会拥有一个包含静态库和最终目标应用程序的工作区。

在我的场景中,我正在构建一个静态库。更具体地说,我正在破解一个 MyLib.framework 供用户使用。我真的想管理 MyLib.framework 与 Cocoapods 的依赖关系,但是当我的库的消费者也使用 Cocoapods 时,它会产生很多痛点。

例如,我的库有一个 AFNetworking 依赖项,我使用 Cocoapods 对其进行管理。当我构建我的库时,它链接到 libPods.a 中,其中包括 AFNetworking 以及一些“虚拟”文件/对象。如果我的框架的用户也使用 Cocoapods 来构建他们的应用程序,他们将看到类似这样的内容:

duplicate symbol _OBJC_METACLASS_$_PodsDummy_Pods in:
    /Users/erikkerber/Dropbox/Projects/MillMain/MyLib.framework/BuddySDK(Pods-dummy.o)
    /Users/erikkerber/Library/Developer/Xcode/DerivedData/MillMain-fngfqhlslygksgcfuciznkpqfrbr/Build/Products/Debug-iphonesimulator/libPods.a(Pods-dummy.o)
duplicate symbol _OBJC_CLASS_$_PodsDummy_Pods in:
    /Users/erikkerber/Dropbox/Projects/MillMain/MyLib.framework/BuddySDK(Pods-dummy.o)
    /Users/erikkerber/Library/Developer/Xcode/DerivedData/MillMain-fngfqhlslygksgcfuciznkpqfrbr/Build/Products/Debug-iphonesimulator/libPods.a(Pods-dummy.o)
ld: 2 duplicate symbols for architecture i386

我想如果他们要添加 AFNetworking 依赖项,他们也会得到与 AFNetworking 相关的重复符号。

我计划最终也使用 Cocoapods 分发 MyLib,但我也希望能够分发 MyLib.framework 本身。

有什么方法可以在我的库中使用 Cocoapods,同时让 Cocoapods 对任何潜在用户都是安全的?

最佳答案

简而言之,分发预构建库的唯一好方法是包含任何依赖项,而是将其留给用户。 IE。在您的示例中,您将指导您的用户如何将 AFNetworking 添加到他们的项目中。这同样适用于 dummy 文件。

话虽如此,您当然可以选择多个预构建变体:

  • 包括所有依赖项。
  • 仅包含您的库的源代码,将依赖关系留给用户。

我们一直在讨论创建一个插件来生成独立的静态库,以达到您想要的目的,但这还没有开始,可能需要更长的时间。 (直到有人/任何人有时间。)

作为解决方法,您可以使用 Podfile 的 post_install hook完全删除虚拟文件。 (无论如何,只有像 Testflight 这样的非源代码库才需要这些。)例如类似于以下内容:

post_install do |installer|
  installer.project.targets.each do |target|
    source_files = target.source_build_phase.files
    dummy = source_files.find do |file|
      # TODO Fix this to the actual filename
      # puts "File: #{file.file_ref.name}"
      file.file_ref.name == 'TheDummyFile.m'
    end
    puts "Deleting source file #{dummy.inspect} from target #{target.inspect}."
    source_files.delete(dummy)
  end
end

这是未经测试的代码。

post_install Hook 生成 CocoaPods 安装程序对象,您可以从中获取 Pods.xcodeproj 目标,您可以找到相关文档 here .从那里您可以向下钻取并对项目执行任何您喜欢的操作,该项目在运行此 Hook 后保存到磁盘。

关于ios - 使用 Cocoapods 构建静态库时防止重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21249273/

相关文章:

iphone - 如何在本地录制 iphone 中的电话?

ios - 带子节点的SKSpriteNode的触摸检测

ios - 消除模态呈现 VC 和弹出呈现 VC

ios - Swift Singleton Init 在 XCTest 中被调用两次

ios - 如何添加objectAtIndex :i of NSArray to NSMutableDictionary

c++ - 我怎样才能完成每个编译程序/动态库的对象的单个实例?

gcc - 强制 CMake 使用静态库

ios - NSLayoutConstraint 不是每次都更新

ios - didFinishNavigation 没有被调用

objective-c - 如何创建包含 Swift 和 ObjC 代码并为 iOS7 构建的 Touch Framework 或 Static Lib?