LoginSignup
33
31

More than 5 years have passed since last update.

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

Posted at

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

33
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
31