24/7 twenty-four seven

iOS/OS X application programing topics.

libxml2 をリンクしていて、iPhone SDK 3.x でビルド、Deployment Target を iPhone OS 2.x に設定しているとき、OS 2.x の環境で実行するとクラッシュする場合の対処

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

ここまでで、実機上は正常に動作するようになります。
ただ、シミュレータで実行する時に適切なライブラリに切り替えられないため、シミュレータ用の設定を追加します。

シミュレータ用の設定を追加する

「他のリンカフラグ」を選択した状態で、左下にあるクリックメニューから「ビルド設定条件を追加」を選択します。

「Any SDK」を「Any iPhone OS Device」に変更します。
同様の手順で、もう一つ設定を追加し、そちらは「Any iPhone OS Simulator」に設定します。
シミュレータのリンカフラグには「-lxml2」を指定します。