如何使用弱链接的CocoaPods库构建iOS框架

时间:2014-11-06 23:13:34

标签: ios iphone frameworks cocoapods weak-linking

我正在尝试使用Xcode 6提供的新模板构建iOS框架(Test.framework)来创建Cocoa Touch框架。 该框架具有Podfile中指定的不同依赖关系(如AFNetworking或FacebookSDK)。我不希望将依赖项包含在框架中,我只想链接它们。

问题在于,当我构建框架时,libPods.a被链接并包含在内。 问:如何链接libPods.a库,但不将其包含在框架中?


更多详情:

我已阅读有关弱链接的信息: https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html 但是我没有太多玩项目设置的经验,所以我不是专业人士。

我试图将libPods.a作为“可选”但没有任何改变,仍然包含依赖项。

我尝试从Build Phases中的“Link Binary With Libraries”部分删除libPods.a,但是我收到此错误(在清理项目文件夹并重新构建之后):

ld: library not found for -lPods-MyFramework-AFNetworking

我试图从“其他链接器标志”中删除所有标志,但它给了我未定义的符号:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_FBSession", referenced from:
      objc-class-ref in TestClass.o
ld: symbol(s) not found for architecture armv7

以下是包含库的干净项目的源代码: https://www.dropbox.com/sh/0ymuzw6kiagz02j/AABzyHiZVaQQvBEnjBgRBq3ua?dl=0

2 个答案:

答案 0 :(得分:1)

我无法评论,所以我会在这里回答。 我想你不能这样做。 Cocoapods创建一个静态库而不是动态库,因此编译时所有代码都应该存在并嵌入到框架中。

Cocoapods documentation,转到"幕后发生了什么?"详细解释

如果你想为一些常用的pod配置一些基本配置,最好的方法是制作一个自定义cocoapod,其他的作为依赖。这样,您可以依靠cocoapods来管理版本并根据您的偏好更新代码。我自己也使用类似的方法,我对结果非常满意。

答案 1 :(得分:0)

下面的post_install代码位于Podfile的底部。它允许您指定所需的目标以及将被弱链接的框架。我们可以利用它来弱链接动态框架目标中的框架,但在编译我们的核心应用程序时继续使它链接正确性。

targets_to_weaklink=['Target1']
frameworks_to_weaklink=['Framework1']
post_install do |installer|
  targets_to_weaklink.map!{|t| t="Pods-#{t}"}
  installer.pods_project.targets.each do |target|
    next unless targets_to_weaklink.include?(target.name)

    target.build_configurations.each do |config|
      base_config_reference = config.base_configuration_reference
      unless base_config_reference.nil?
        xcconfig_path = base_config_reference.real_path
        xcconfig = File.read(xcconfig_path)
        frameworks_to_weaklink.each do |framework|
          xcconfig = xcconfig.gsub(/-framework "#{framework}"/, "-weak_framework \"#{framework}\"")
        end
        File.open(xcconfig_path, "w") { |file| file << xcconfig }
      end
    end
  end
end