【问题标题】:Include static library in Swift framework在 Swift 框架中包含静态库
【发布时间】:2021-08-18 20:26:36
【问题描述】:

我正在尝试围绕 C/C++ 中的静态库编写 Swift 包装器。

整个库由多个静态库(*.a)和头文件组成。

我的文件结构如下:

Info.plist
module.modulemap
MyFrameworkProject.h
Wrapper/
    WrapperClass.swift
Dependencies/
    third_party_lib_1/
        include/
            main_1.h
            subh1.h
            subh2.h
        lib/
            libtp_1.a
    third_party_lib_2/
        include/
            main_2.h
            subh1.h
            subh2.h
        lib/
            libtp_2.a
    third_party_lib_3/
        include/
            main_3.h
            subh1.h
            subh2.h
        lib/
            libtp_3.a

module.modulemap以下内容:


module MyFrameworkInternalUtils {
    header "Dependencies/third_party_lib/include/main_1.h"
    export *
}

main_1.h 包含我想在我的 Swift 包装器中使用的所有声明。

我已将 Dependencies/third_party_lib/include 添加到项目的 Header Search Paths 中,并将库添加到“使用静态库链接二进制文件”构建阶段。

但是,在构建项目时,我收到了抱怨“assert”和“jmp_buf”未声明的错误消息。这些是在third_party_lib_3/sub1.h 和“third_party_lib_2/sub2.h”之类的文件中声明的。而third_party_lib_1/main.h 递归包含这些文件(意思是third_party_lib_1/main.h 包含third_party_lib_2/main.hthird_party_lib_2/main.h 包含third_party_lib_2/sub2.h)。

我猜这与标题搜索路径/包含路径有关,但我无法弄清楚究竟是什么。

我错过了什么?我已经花了一些时间来适应 LLVM 的 modulemap 文件格式。

【问题讨论】:

  • 将所有需要的标头添加到模块映射中。
  • @EugeneDudnyk 如果标题超过 100 个,我该怎么办? Afaik 包含的顺序很重要。

标签: ios swift xcode linker frameworks


【解决方案1】:

尝试在模块映射中使用umbrella header 而不是header

  1. 创建MyFrameworkInternalUtils.h,其中包含来自所有静态库的所有伞头文件(即#include <third_party_lib_1/main_1.h>)。
  2. 将此MyFrameworkInternalUtils.h定义为模块的伞头,

像这样:

module MyFrameworkInternalUtils {
    umbrella header "MyFrameworkInternalUtils.h"
    export *
}

有关更多信息,请查看模块映射语言所提供的内容,here

【讨论】:

  • 现在它在抱怨“third_party_lib_3/include/subdir/subsub2.h file not found with include; use "quotes" instead"。
  • 预处理器是在MyFrameworkInternalUtils.h 标头中抱怨,还是来自模块映射?
  • 它在头文件中抱怨。我需要将它们中的每一个都添加到“标题搜索路径”吗?
  • 使用框架是另一回事 - 你应该将所有由 modulemap 直接或间接导出的标题复制到框架的 Headers 文件夹中,保留标题文件夹结构,然后才能实际使用框架。所以你最好在伞形标题之间有一个一致的文件夹结构。
  • 您可以查看 cocoapods 是如何运送 OpenCV iOS 框架头文件的。
猜你喜欢
  • 2010-12-26
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多