Как импортировать статическую библиотеку 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 * }
}
- В настройках сборки проекта найдите
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'
это я еще не могу разрешить