【问题标题】:How to make static library modular in Swift 4?如何在 Swift 4 中使静态库模块化?
【发布时间】:2017-12-05 11:51:21
【问题描述】:

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

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

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

No such module 'StaticA'

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

【问题讨论】:

  • 你在这方面有什么收获吗?
  • 仍然没有找到方法。

标签: ios swift xcode static-libraries swift4


【解决方案1】:

您需要启用一些构建设置:

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

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

注意:

  • 我一般把modulemap放在模块目录的最顶层
  • 即比xcodeproj 文件低一级:
    • StaticA.xcodeproj 然后我会在StaticA/module.modulemap

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

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

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

您可以使用脚本将生成的*-Swift.h 复制到包含文件夹,以便您可以从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}"

【讨论】:

    【解决方案2】:

    转到项目的构建阶段

    单击“Link Binary With Libraries”下的“+”以添加新库。然后点击“添加其他”按钮。

    并且请确保您在 Build Settings

    下拥有 Library Search Paths 的 lib 路径

    【讨论】:

    • 然后请检查 FRAMEWORK_SEARCH_PATHS 的路径。
    • 无需设置框架搜索路径,我们处理的是库。我需要使库模块化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2021-10-22
    • 1970-01-01
    • 2019-04-04
    • 2014-05-19
    相关资源
    最近更新 更多