SwiftからCライブラリを使いたい場合、
アプリプロジェクトではbridging headerでヘッダーをincludeしてライブラリをリンクすれば使えますが
Frameworkプロジェクトではbridging headerが使えません。
そのため必要なヘッダーファイルをプロジェクトにコピーしてアンブレラヘッダーでincludeする必要があります。
(更にコピーしたヘッダーをpublicにしないとエラーが出ます。)
最近、Cライブラリをmodule化してもいけると知ったので手順を書きます。
ここでは例としてlibxml2を使う場合を書きます。
設定手順
module.modulemapを用意する
1.プロジェクトファイルがあるディレクトリに module.modulemap
を作成
module libxml2 [system] {
link "xml2"
umbrella header "umbrella-libxml2.h"
export *
module * { export * }
}
2.アンブレラヘッダーを作成
// 使いたいライブラリのヘッダーを書く
#import <libxml2/libxml/HTMLtree.h>
#import <libxml2/libxml/xpath.h>
#import <libxml2/libxml/xpathInternals.h>
プロジェクトを設定する
ヘッダーのパスを設定
Build Settings > Search Paths > Header Search Paths
に $(SDKROOT)/usr/include/libxml2
を追加。
module.modulemapファイルへのパスを設定
Build Settings > Swift Compiler - Search Paths > Import Paths
に $(SRCROOT)
を追加。
使う
ここまで設定してswiftファイルに import libxml2
と書けば
フレームワーク内でCライブラリが使えるようになります。
もう少し良くする
上記までで使えるようになりますが、
このままでは作成したフレームワークをインポートするアプリプロジェクトでも
ヘッダーのパスを設定する必要があります。
これはヘッダーをフルパスで指定すれば解決します。
参考リンク
Getting Started Using C Libraries from Swift
Importing CommonCrypto in a Swift framework - stackoverflow