【问题标题】:How to build an iOS framework with weak-linked CocoaPods libraries如何使用弱链接的 CocoaPods 库构建 iOS 框架
【发布时间】:2015-01-03 15:39:24
【问题描述】:

我正在尝试使用 Xcode 6 提供的用于创建 Cocoa Touch 框架的新模板来构建 iOS 框架 (Test.framework)。 该框架具有在 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

【问题讨论】:

    标签: ios iphone frameworks cocoapods weak-linking


    【解决方案1】:

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

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

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

    【讨论】:

    • 有人知道 cocoapods 中的“-weak_framework”是什么吗?
    【解决方案2】:

    下面的 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
    

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2011-02-07
      • 1970-01-01
      • 2018-11-16
      • 2011-09-22
      • 2012-03-12
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多