首页 > 解决方案 > Xcode中的弱链接静态库

问题描述

我正在尝试实现与静态库的弱链接。我读过这两篇文章,“ iOS 上的静态库”和“ Jesse Pinkman 如何破解 iOS 上的动态库”,它们真的很有帮助。

但是,我处于无法实现我想要的情况的情况下。我已经开发了两个框架,我们称它们为MainFeature它们可以作为 pod 和 swift 包安装。

Main不依赖于Feature, 也不Feature依赖于Main, 但如果开发者的 podfile 中同时存在 和 , 则Main可以使用's 功能。这是通过在其 podspec 中的 ' 框架搜索路径上添加 ' 路径来实现的。FeatureMainFeatureFrameworkMain

Main.podspec

# This works when use_frameworks! is added in the podfile.
s.pod_target_xcconfig = {
    "FRAMEWORK_SEARCH_PATHS" => [
      "$(inherited)",
      "${PODS_CONFIGURATION_BUILD_DIR}/Feature",
    ],
}

这样,可以通过以下方式Main使用's 的功能Feature

#if canImport(Feature)
print("SUCCESS!!!")
let feat = Feature()
feat.test()
#else
print(“Failed to import Feature“)
#endif

当集成开发人员不包含use_frameworks!在他的 podfile 中(例如 React Native)时,问题就开始了。Main然后Feature构建为静态库,它可以编译,但它永远不会进入 SUCCESS 块。

看完上面的文章,我相信正确的做法应该是这样的

Main.podspec

s.pod_target_xcconfig = {
    "LIBRARY_SEARCH_PATHS" => [
      "$(inherited)",
      "${PODS_CONFIGURATION_BUILD_DIR}/Feature",
    ],
    "SWIFT_INCLUDE_PATHS" => [
        "$(inherited)",
        "${PODS_CONFIGURATION_BUILD_DIR}/Feature",
    ],
  }

也许还添加

  Main.podspec

  s.pod_target_xcconfig = {
   …
    'OTHER_LDFLAGS' => [
        "$(inherited)",
        '-ObjC',
        '-weak_library -l"Feature"'
    ],
    …
  }

Defines module = YES/NO我已经在Feature' 方面尝试了上述方法。

Feature.podspec

s.pod_target_xcconfig = {
    'DEFINES_MODULE' => 'YES'
}

但是,上述方法均无效。有没有人知道我可能做错了什么,或者指出我的方向?

标签: iosswiftobjective-cxcodecocoapods

解决方案


我最终嘲笑了你在这里需要的东西。

但是,我只能通过以下方式解决use_frameworks您的问题的一半(没有):

Main.podspec

# To include Swift Module
'OTHER_SWIFT_FLAGS' => ['$(inherited)', '-Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/Feature/Feature.modulemap"']

Podspec 方面:

  • 不确定为什么modulemapcocoapod 设置需要文件路径(可能是库链接较弱时)

Podfile 方面:

  • 它会在没有的情况下工作use_frameworks
  • 它不适用于在指定路径use_frameworksmodulemap找不到文件(因为它只考虑静态路径场景)& Xcode 会认为它是必需的。不确定如何modulemap在 Podspec 中选择指定文件。

我希望我能够提供帮助,即使它已经完成了一半。


推荐阅读