SwiftでTagLibを使う

広告

TagLib

 

MacでTagLibをビルドして使えるようにする方法。
そしてSwiftから利用する方法。


  1. TagLibから好きなバージョンをダウンロードする。今回は最新の1.10BETAを使ってみる。
  2. 解凍する。
  3. Terminalを使って解凍したディレクトリへ移動する。
  4. 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"へ変更
  5. makeする。
    make
    sudo make install
  6. /Library/Frameworks/の中に、tag.frameworkとtag_c.frameworkができあがるので、tag.frameworkをどこかにコピーする。
  7. terminalでコピーしたtag.frameworkがある場所に移動する。
  8. 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
  9. 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はこの方法では導入できませんでした。
こちらの記事を参考にしてください。