解決したい課題
あるdylibを使用するCocoaアプリケーションを開発する際、ユーザーがそのdylibをインストールしているか分からないのでアプリケーション中にバンドルして提供したい
この例では libusb-1.0.0.dylibをバンドルした時の方法について解説する
手順
- dylibをコピー
- Build Phase(Copy Files)を追加
- Build Phase(Run Script)を追加
- Link Binary with Librariesの変更
dylibをコピー
xcodeに libusb-1.0.0.dylibを追加する
Build Phase(Copy Files)を追加
Targetの Build Phaseを修正する。 Editor → Add Build Phase → Add Copy Files Build Phase
このPhaseはLink Binary with Librariesの上に置く。
- Destination: Shared Support
- Subpath: 空白
- Copy only when installing: チェックなし
リストに libusb-1.0.0.dylibを追加。
Build Phase(Run Script)を追加
Editor → Add Build Phase → Add Run Script Build Phase
このPhaseは上述の Copy Files Build Phaseの下に置く。
スクリプトは以下のとおり。これは参考にしたサイトからそのまま。
# !/bin/bash
# In Xcode you actually enter the path for the shell
# you want to use in a text field about the shell source.
# So, !/bin/bash might not be necessary.
# Space separated list of libraries.
# Enter any dylibs you have in your Copy File Phase.
TARGETS=(libusb-1.0.0.dylib)
EXECFILE=${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}
LIBPATH=${BUILT_PRODUCTS_DIR}/${SHARED_SUPPORT_FOLDER_PATH}
NEWLIBPATH=@executable_path/../SharedSupport
for TARGET in ${TARGETS[@]} ; do
LIBFILE=${LIBPATH}/${TARGET}
TARGETID=`otool -DX "${LIBPATH}/$TARGET"`
NEWTARGETID=${NEWLIBPATH}/${TARGET}
install_name_tool -id "${NEWTARGETID}" "${LIBFILE}"
install_name_tool -change ${TARGETID} ${NEWTARGETID} "${EXECFILE}"
done
Link Binary with Librariesの変更
libusb-1.0.0.dylibを追加する。今回はlibusbが依存している IOKITも追加している。
完成
これでバンドルとリンクの作業は完成。libusbのexampleを AppDelegateに入れて動かしてみたがちゃんと動いている。
注意
リリース時にはライセンス表示を忘れずに。
参考