Xcode
iOS
Swift
iOSDay 6

Framework内でCライブラリをmoduleとして使う方法

More than 3 years have passed since last update.

SwiftからCライブラリを使いたい場合、

アプリプロジェクトではbridging headerでヘッダーをincludeしてライブラリをリンクすれば使えますが

Frameworkプロジェクトではbridging headerが使えません。

そのため必要なヘッダーファイルをプロジェクトにコピーしてアンブレラヘッダーでincludeする必要があります。

(更にコピーしたヘッダーをpublicにしないとエラーが出ます。)

最近、Cライブラリをmodule化してもいけると知ったので手順を書きます。

ここでは例としてlibxml2を使う場合を書きます。


設定手順


module.modulemapを用意する


1.プロジェクトファイルがあるディレクトリに module.modulemap を作成


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