Xcode で静的ライブラリをアプリと同時開発する場合の検索パス

SPECIAL


静的ライブラリをアプリと同時開発する場合のライブラリ検索パス

アプリケーションと静的ライブラリを同時開発する場合 で記したようにして、ひとつのワークスペースにアプリと静的ライブラリを複数登録して開発していたときのこと、どうもライブラリの検索パス(Library Search Paths)が適切な設定になっていないような感じがしました。

というのも、プロジェクトの "Build Phases" で "Link Binary With Libraries" に、ワークスペースからライブラリを登録したからなのかどうなのか、いつの間にかプロジェクトの "Build Settings" の "library Search Paths" のところに、次のような検索パスが登録されていました。

$(inherited) "/Users/tomohiro/Library/Developer/Xcode/DerivedData/EZ-NET_IP_Phone-gekbbspdsqwvageqhshyxxoswyhk/Build/Products/Debug-iphonesimulator"

このパスには、アプリのビルドの時に、各静的ライブラリがまとめて生成されるようで、アプリのビルド自体は成功するのですけど、気になったのがパスの最後が、どのビルドでも Debug-iphonesimulator となっているところでした。

 

ここは、普通は Release ビルドなら Release-iphonesimulator となっても良さそうな気がしたので、次のように直してみたところ、アプリの Archive 作成時に、ライブラリが見つからないとのことでエラーとなってしまうのでした。

$(inherited) "/Users/tomohiro/Library/Developer/Xcode/DerivedData/EZ-NET_IP_Phone-gekbbspdsqwvageqhshyxxoswyhk/Build/Products/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"

このようにすることで、ビルドの種類やプラットフォームに応じて適切なパスに切り替わるだろうと思ったのですけど、Archive で採用される Release ビルドの場合だと、どうやらこのパスに静的ライブラリが用意されない感じです。

それなら、Release ビルドでも "Debug-iphonesimulator" が適切なのかとも疑ってみたのですけど、やはりこのパスに存在しているライブラリは、デバッグビルドを行ったときの更新日時で止まっています。

 

つまり、もしかするとこれまで Release ビルドでリンクされていた静的ライブラリは、Debug ビルドで作成されたライブラリだったのかもしれません。

それなら、Release でビルドされた静的ライブラリはどこに保存されているかを探してみると、どうやら "Build" の後が違っていて、その先は "Intermediates/EzIPPhoneNew/BuildProductsPath/Release-iphonesimulator" に保存されている様子でした。

もしかすると、デバッグコードを取り除いたライブラリは、このパスに保存されるようになっているのかもしれません。

 

ともあれ保存されているパスがわかれば、これを "Library Search Paths" の Release ビルドに限ったところに登録してあげれば良さそうです。

$(inherited) "/Users/tomohiro/Library/Developer/Xcode/DerivedData/EZ-NET_IP_Phone-gekbbspdsqwvageqhshyxxoswyhk/Build/Intermediates/ArchiveIntermediates/$(PROJECT_NAME)/BuildProductsPath/Release$(EFFECTIVE_PLATFORM_NAME)/"

このように、プラットフォームによって適切なフォルダが選ばれるようにしつつ、リリースビルドの時には "Intermediates" ディレクトリの中の静的ライブラリをリンクしてあげるようにすることで、Archive 作成時にも正常にビルドが通るようになりました。

ビルドでできたバイナリのサイズもこれまでより 0.4MB ほど小さくなっているようで、確実なことは判らないのですけど、リリース用に最適化された静的ライブラリがリンクされるようになってくれたかもしれないです。