2012-01-10 4 views
1

私はデバイス上で動作するiPhoneアプリを持っています。今私はシミュレータでそれを実行する必要があります。Xcode iOS Simulatorで実行されるようにライブラリを設定するには?

オープンソースプロジェクト(http://site.icu-project.org/)を使用しています。これをコマンドラインからビルドして、アーム互換の.aファイルを作成します。私はこれらを私のiPhoneプロジェクトとリンクすることができ、それはデバイス上で動作します。

私は予想通り、私は、ビルドが失敗し、シミュレータにターゲットを切り替える場合:

LD:警告:libicudata.aで、ファイルがリンクされて アーキテクチャではありませんサポートされていないファイル形式のために建設されたが(I386)

しかし、私は地元の使用(x86_64版)用にコンパイルLIBSを使用している場合、私は困惑する持っている同じエラーを取得。シミュレータの3番目のアーキテクチャを指定する必要はありますか?どれ?構成を設定するにはどうすればよいですか? 、私は今ことを見ギョームが示唆したように

(とConnect iPhone App to PostgreSQL Using Libpqが確認された):追加するHow to build ICU so I can use it in an iPhone app?

編集:

参考

が、これは私が2つの異なる標的のためICUプロジェクトの構成方法でありますエミュレータには32ビットのビルドが必要です。最後の部分はです。どのように設定するのですか

ライブラリーには標準のconfigureスクリプトがありますが、私は知っていますが、まだかなり新しいです。

を追加するように編集:

私はここまで得てきましたが、i686のへの言及は明らかに間違っています。

「ホスト」と「ターゲット」オプションが必要な場合は、i386がクロスコンパイルと見なされるかどうかわかりません。

ICU_PATH=/Users/eric.grunin/Documents/dev/icu2 

DEVROOT=/Developer/Platforms/iPhoneSimulator.platform/Developer 
SDKROOT=$DEVROOT/SDKs/iPhoneSimulator4.3.sdk 
SYSROOT=$SDKROOT 

ICU_FLAGS="-I$ICU_PATH/source/common/ -I$ICU_PATH/source/tools/tzcode/ " 

export CXXPP= 
export CXXPPFLAGS= 
export CPPFLAGS="-I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/include/ -I$SDKROOT/usr/include/c++/4.2.1/armv7-apple-darwin10/ -I./include/ -miphoneos-version-min=2.2 $ICU_FLAGS" 

export CFLAGS="$CPPFLAGS -pipe -no-cpp-precomp -isysroot $SDKROOT" 
export CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" 
export CXXFLAGS="$CFLAGS" 

export CC="$DEVROOT/usr/llvm-gcc-4.2/bin/i686-apple-darwin10-llvm-gcc-4.2" 
export CXX="$DEVROOT/usr/llvm-gcc-4.2/bin/i686-apple-darwin10-llvm-g++-4.2" 
export LDFLAGS="-L$SDKROOT/usr/lib/ -isysroot $SDKROOT -Wl,-dead_strip -miphoneos-version-min=2.0" 

cd $ICU_PATH 
mkdir simbuild 
cd simbuild 

$ICU_PATH/source/configure --enable-static --disable-shared 
gnumake 

答えて

1

これは、私はそれが動作するようになった方法です。私はそれを後で見ることができるようにここに置いています。

これは不完全な可能性がありますので、自由に修正してください。コメントは、私が構築していたICUライブラリに特有のものから、一般的なものを分離しようとします。

// This is is required by the ICU configure step 

# must be ABSOLUTE PATH 
ICU_PATH=/Users/eric.grunin/Documents/dev/icu2 

// First crucial bit: specify the Simulator 

DEVROOT=/Developer/Platforms/iPhoneSimulator.platform/Developer 
SDKROOT=$DEVROOT/SDKs/iPhoneSimulator4.3.sdk 
SYSROOT=$SDKROOT 

// for convenience 

ICU_FLAGS="-I$ICU_PATH/source/common/ -I$ICU_PATH/source/tools/tzcode/ " 

export CXXPP= 
export CXXPPFLAGS= 

// current version of gcc is missing some #include files, we have to get them elsewhere 

export CPPFLAGS="-I$SDKROOT/usr/include/c++/4.2.1/i686-apple-darwin10/ -I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/include/ -I$SDKROOT/usr/include/c++/4.2.1/armv7-apple-darwin10/ -I./include/ -miphoneos-version-min=2.2 $ICU_FLAGS" 

// MUST specify -arch i386 

export CFLAGS="$CPPFLAGS -pipe -arch i386 -no-cpp-precomp -isysroot $SDKROOT" 
export CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" 
export CXXFLAGS="$CFLAGS" 

export CC="$DEVROOT/usr/bin/gcc" 
export CXX="$DEVROOT/usr/bin/g++" 

// MUST add -arch i386 here. 
// Also: to avoid "undefined symbol: _Unwind_Resume", add -lgcc_eh 

export LDFLAGS="-arch i386 -L$SDKROOT/usr/lib/ -lgcc_eh -isysroot $SDKROOT -Wl,-dead_strip -miphoneos-version-min=2.0" 

cd $ICU_PATH 
mkdir simbuild 
cd simbuild 

// Not sure if --host is really needed 

$ICU_PATH/source/configure --enable-static --disable-shared --host=i686-apple-darwin10 
gnumake 

ICUライブラリがすでに非常に大きく、私は可能な限り小さく、最終的なアプリを維持する必要があるので、私はおそらく、脂肪のバイナリを作るつもりはありません。

編集

を追加するためには、私は脂肪ライブラリーアプローチを試してみました:それはは、悲しいかな、私のアプリのサイズを三倍。

4

fatライブラリを構築する必要があります。fatライブラリは、多くのアーキテクチャのコードを1つのファイルに埋め込むライブラリです。
デバイスの場合は、armv6armv7というアーキテクチャを追加する必要があります。シミュレータの場合、i386。詳細については、この答えとXcodeからこれを行う方法上のスクリプトに

ルック:https://stackoverflow.com/a/3647187/272342

+0

しかし、私はそのライブラリにどのようなアーキテクチャを取り入れていますか? – egrunin

+0

答えに必要なアーキテクチャを追加しました。 – Guillaume

+0

ああ、私のlibは64ビット(x86_64)で、Simulatorは32ビット(i386)だと言っていますか? – egrunin

1

これは単なるデータライブラリです。あなたはそれを何度か構築する必要はありません。 ICUをビルドするときに--with-data-packaging=archiveを使用して、icudt*.datというファイルを生成します。アプリケーションが起動するときに、u_setDataDirectory()を呼び出して、どのディレクトリにその.datファイルがあるかを伝えます。 u_setDataDirectory()

+0

私たちが同じことを話しているのかどうかわかりません - コードファイルを3つの異なるプロセッサ用にビルドするか、実行しません。 (私はlibicudata.aがちょうどデータであることを知っています、私はすでに3.5Mにそれを持っています)。 しかし、私は静的なリンクは私が使用していないコードをプルーニングするほどスマートでなければならないことをドキュメントから知っているので、私は結局はスマートバイナリを試してみると思います。 – egrunin

+0

私はICUの3つのビルドをバンドルしていることを示唆しているようですが、実行時にそのうちの1つだけが使用されます。これがデスクトップアプリの場合、私は気にしないだろうが、もし20MB以上になると、アップルは「空気中」の配信を許可しないだろうという要求がある。 – egrunin

+0

いいえ、3つのビルドをバンドルすることを提案していません。私はライブラリとしてデータを構築しないことを提案していましたが、icu/source/stubdataが構築する 'スタブ'(ほぼ空の)データライブラリを使用していました。 .datファイルは、同じエンディアンを持つものの間で共有できます。他の答えを読み返しても、マルチアーキテクチャ静的ライブラリを構築する場合、最終ビルドは必要なものだけでなければなりません。 –

関連する問題