Как импортировать статическую библиотеку Objective C в Swift Framework?

Im пишет динамическую Framework (Proto.framework) для OS X в Swift. Я хочу включить код из статической библиотеки (libstat.a), который написан в Objective C. Heres, что Ive получил:

// Dynamic.swift in Proto.framework
class Dynamic {
    func doSomethingWithStat() {
        Stat().statThing()
    }
}

// Stat.h in libstat.a static library
@interface Stat : NSObject
- (void)statThing;
@end

// Stat.m
@implementation Stat
- (void)statThing {
    NSLog(@"OK");
}
@end

В моей цели для Proto.framework я связал ее с libstat.a. Когда я пытаюсь создать Proto, естественно, он не компилируется, потому что он не может найти определение для Stat().statThing(). Он не знает символы для моей статической библиотеки. Как мне рассказать об этом?

Для приложений Id использует заголовок моста и делает #import <Stat/Stat.h>. Но компилятор ошибся и говорит мне Bridging headers aren’t allowed in frameworks. OK.

Поэтому я включаю его в свой "заголовок зонтика" (Proto.h), но это говорит мне error: include of non-modular header inside framework module. OK.

Создание моей целевой библиотеки Stat Defines module: YES, похоже, не может изменить ошибку даже после чистой сборки. Поэтому я не уверен, как это сделать.

Может ли кто-нибудь указать мне в правильном направлении?

Ответ 1

Самый простой способ добиться этого - использовать файл карты модуля. Ниже я предполагаю, что у вас есть Proto.framework в отдельном проекте, который называется Proto.

  • Создайте файл module.modulemap в своей структуре, содержащий следующее (при необходимости замените путь к файлу заголовка):

_

framework module Proto {
    umbrella header "Proto.h"

    // Load a C header to be used in Swift - here /usr/include/sys/stat.h:
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sys/stat.h"

    export *
    module * { export * }
}
  1. В настройках сборки проекта найдите Module Map File в разделе Packaging. Введите $(SRCROOT)/Proto/module.modulemap

Что это. С этого момента вы сможете использовать все, что объявлено в stat.h в Swift.

Ответ 2

В настройках сборки для Proto.framework попробуйте установить опцию Allow Non-modular Includes In Framework Modules на Yes.

Настройки Xcode

Ответ 3

Я решил эту ошибку, создав заголовок Public (вместо Project)

Перейдите к своей целевой фазе сборки и переместите заголовок соответственно:

Настройки видимости заголовка

Это работает для моей цели "lib". Но я все еще не могу создать цель libTests. Здесь я получаю 2 ошибки:

  • 'header.h' файл не найден с include; вместо этого используйте "цитаты"
  • и снова: включить немодульный заголовок внутри фрейм-модуля 'lib'

это я еще не могу разрешить