iPhone SDK 3.x で libxml2 を使うプロジェクトを Deployment Target を iPhone OS 2.x に設定してビルドしたとき、OS 2.x の環境で実行すると、libxml2 のリンクに失敗します。
dyld: Library not loaded: /usr/lib/libxml2.2.dylib
Referenced from: /var/mobile/Applications/5B356D4E-B462-4B7A-9157-9D554A90C09D/HatenaTouch.app/HatenaTouch
Reason: Incompatible library version: HatenaTouch requires version 10.0.0 or later, but libxml2.2.dylib provides version 9.0.0
エラーの原因は、3.x と 2.x で必要な libxml2 のバージョンが異なることによります。
この問題への対処がアップルのサイトに載っていましたので、紹介します。
Q: Why does my application crash with an "Incompatible library version" error message?
A: If the following conditions are met:
- your application links directly to libxml2, and
- is built using the iPhone SDK 3.0 or later, and
- has iPhone OS 2.x as a deployment target
then the application will crash when run on 2.x devices. This is due to a compatibility version change in libxml2 between iPhone OS 2.2.1 and iPhone OS 3.0 and later. You can work around this issue by linking directly to the older version of libxml2.
iOS Developer Library
ライブラリへのパスを直接指定する
You can link directly to a library by modifying the "Other Linker Flags" entry for your Xcode project. To do so, open the project's Build settings and search for "Other Linker Flags". Then find the full path to libxml2 in the appropriate 2.x SDK and add that to the flags. For example, if you have the 2.2.1 SDK installed, you can use the following:
$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/usr/lib/libxml2.dylib.
iOS Developer Library
バージョン違いの問題を解決するために、libxml2 へのリンクパスを直接指定します。
プロジェクト>プロジェクト設定の編集>ビルド と選択します。
「他のリンカフラグ」に設定されている libxml2 へのリンクをフルパスの指定に変更します。
-lxml2
↓↓↓
$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/usr/lib/libxml2.dylib
ここまでで、実機上は正常に動作するようになります。
ただ、シミュレータで実行する時に適切なライブラリに切り替えられないため、シミュレータ用の設定を追加します。