SwiftでTagLibを使う
MacでTagLibをビルドして使えるようにする方法。
そしてSwiftから利用する方法。
- TagLibから好きなバージョンをダウンロードする。今回は最新の1.10BETAを使ってみる。
- 解凍する。
- Terminalを使って解凍したディレクトリへ移動する。
- TagLibのページに書いてある方法だとうまくいかなかったので、以下の内容でビルドする。今回は10.9のSDKを使用する。
cmake -DCMAKE_BUILD_TYPE=Release \ -DBUILD_FRAMEWORK=ON \ -DCMAKE_C_COMPILER=/usr/bin/gcc \ -DCMAKE_CXX_COMPILER=/usr/bin/c++ \ -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/ \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 \ -DCMAKE_OSX_ARCHITECTURES="x86_64"
64bitのみを対象にしているので、32bitでも使う場合は、i386も追加した方が良いと思います。
-DCMAKE_OSX_ARCHITECTURES="i386;x86_64"へ変更
- makeする。
make sudo make install
- /Library/Frameworks/の中に、tag.frameworkとtag_c.frameworkができあがるので、tag.frameworkをどこかにコピーする。
- terminalでコピーしたtag.frameworkがある場所に移動する。
- install_name_toolを使ってInstallation Directoryを変更する。
↓の1.15.0はTagLibのバージョンによって多分違うので、確認すること。
install_name_tool -id @rpath/tag.framework/Versions/1.15.0/tag tag.framework/Versions/1.15.0/tag
- XcodeのEmbedded Binariesへ追加する
これで使えるようになる。
install_name_toolでInstallation Directoryを変更しないと、ライブラリが見つからなくてこけるので注意。
cmakeの中のパラメータで指定できるんじゃないかと思うけど、調べてもやり方がよく分からなかったのでこの方法で対応。
tag_c.frameworkが何なのかは不明。
ちなみに、TagLibはC++のため、Swiftから利用する場合はちょっと面倒。
Objective-c++のファイルを作って、そこからTagLibの関数を利用する。
Objective-cのファイルを作って、Objective-c++のファイルを読み出す。
SwiftからObjective-cのファイルを読み出す。
Swift → Objective-c → Objective-c++ → TagLibって感じ。
Objective-c++からTagLibを利用するサンプルはWeb上に結構あるのでそれを参考にすれば問題なし。
Objective-cからObjective-c++は普通にObjective-cを呼ぶのと同じ方法なので問題なし。
SwiftからObjective-cはTransfer-Bridging-Headerを使って呼び出せば良いので問題なし。
結局何が大変だったって、frameworkがうまく作れなかったこと。
他の方が作られたgithubにあるプログラムと最新版のTagLibを使うとうまくビルドが通らず、古いTagLibを使うとビルドできても、いざTagLibを使うとエラーとなったり、TagLibに出ているMacOSのビルド方法でもうまくビルドできず、静的ライブラリはできてもHeader Search Pathへパスを追加してもうまく利用できず彷徨いまくり。
結局先ほど記載の方法で最新版をビルドして、Xcodeのプロジェクトで使えるようになった。
まぁinstall_name_toolに気づくまでにも結構時間がかかったり。
数ヶ月前から、何回も挑戦してはくじけ、やっと使えるようになった。
動いた時はとてもうれしかった・・・長い長い戦いだった。
追記
TagLib 1.11.1はこの方法では導入できませんでした。
こちらの記事を参考にしてください。