I’m writing a dynamic Framework (Proto.framework
) for OS X in Swift. I want to include code from a static library (libstat.a
) which is written in Objective C. Here’s what I’ve got:
// 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
In my target for Proto.framework, I have linked it to libstat.a. When I try to build Proto, naturally it doesn’t compile because it can’t find the definition for Stat().statThing()
. It doesn’t know the symbols for my static library. How do I tell it about that?
For applications, I’d use a bridging header and do #import <Stat/Stat.h>
. But the compiler errors out and tells me Bridging headers aren’t allowed in frameworks
. OK.
So I include it in my “umbrella header” (Proto.h
) but that tells me error: include of non-modular header inside framework module
. OK.
Making my Stat
library target Defines module: YES
doesn’t seem to change the error even after a clean build. So I’m not sure how to do this.
Can someone point me in the right direction?
The easiest way to accomplish that is to use a module map file. Below I assume you have the
Proto.framework
in a separate project, which is calledProto
.module.modulemap
file in your framework containing the following (substitute the path to the header file as needed):_
Module Map File
in sectionPackaging
. Enter$(SRCROOT)/Proto/module.modulemap
That's it. From now on you should be able to use anything declared in
stat.h
in Swift.In your build settings for
Proto.framework
try setting the optionAllow Non-modular Includes In Framework Modules
toYes
.I resolved this error by making the header Public (instead of Project)
Go to your target Build Phases and move the header accordingly:
This works for my 'lib' target. But I am still unable to build libTests target. Here I get 2 errors:
this I am not able to resolve yet