gpt4 book ai didi

ios - 如何在 Swift 4 中使静态库模块化?

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:43 26 4
gpt4 key购买 nike

随着 Swift 4 的发布,Swift 开始支持静态库。但是当我尝试在应用程序内部使用静态二进制文件时,它显示未定义模块的错误。

我们正在创建具有模块化结构的 SDK,每个模块有 15 个框架,但正如 Apple 所建议的那样,添加超过 6 个动态框架并不好(因为动态链接会减慢应用程序启动时间。)。因此,在 Swift 支持静态库之后,我们决定将其转换为静态库,然后创建一个动态框架,为所有 15 个框架提供 Facade 接口(interface)。

我创建了一个名为 StaticA 的静态库并尝试将其添加到动态框架中,但它显示以下错误。

没有这样的模块 'StaticA'

enter image description here

我还将 Defines Modules 设置为 Yes 但它没有帮助。是否可以使用 Swift 使静态库模块化?如果是,则建议方式。谢谢

enter image description here

最佳答案

您需要启用一些build设置:

MODULEMAP_FILE = $(PRODUCT_NAME)/module.modulemap
SWIFT_INCLUDE_PATHS = $(PRODUCT_NAME)
DEFINES_MODULE = YES

另一个可行的选项(不修改build设置)是将 modulemap 文件复制到 include/$(PRODUCT_NAME) 下的产品目录中

注意:

  • 我一般把modulemap放在模块目录的顶层
  • 即从 xcodeproj 文件向下一层:
    • StaticA.xcodeproj 然后我会在 StaticA/module.modulemap

这允许您为您的库定义一个 module.modulemap:

module StaticA {
header "StaticA-Swift.h"
}

通常 StaticA-Swift.h 不可用且不会生成,您“可能”可以不指定它而逃脱......但我没有运气好,需要手动完成。

您可以使用脚本将生成的 *-Swift.h 复制到 include 文件夹,以便您可以从 modulemap 文件中引用它。

#!/usr/bin/env sh

target_dir=${BUILT_PRODUCTS_DIR}/include/${PRODUCT_MODULE_NAME}/

# Ensure the target include path exists
mkdir -p "${target_dir}"

# Copy any file that looks like a Swift generated header to the include path
cp "${DERIVED_SOURCES_DIR}/"*-Swift.h "${target_dir}"

关于ios - 如何在 Swift 4 中使静态库模块化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com