ジェレミーは良い答えを出しましたが、私はいくつかのことを追加して、私の 2 セントを差し上げたいと思います。
更新されたスクリプト
#!/bin/bash
OPT_FLAGS="-O3 -g3"
MAKE_JOBS=8
dobuild() {
export CC
CC=$(xcrun --find --sdk "${SDK}" gcc)
export CXX
CXX=$(xcrun --find --sdk "${SDK}" g++)
export CPP
CPP=$(xcrun --find --sdk "${SDK}" cpp)
export CFLAGS
CFLAGS="${HOST_FLAGS} ${OPT_FLAGS}"
export CXXFLAGS
CXXFLAGS="${HOST_FLAGS} ${OPT_FLAGS}"
export LDFLAGS
LDFLAGS="${HOST_FLAGS}"
./configure --host="${CHOST}" --prefix="${PREFIX}" --enable-static
make clean
make -j"${MAKE_JOBS}"
make install
}
SDK="iphoneos"
ARCH_FLAGS="-arch armv7 -arch armv7s -arch arm64"
HOST_FLAGS="${ARCH_FLAGS} -miphoneos-version-min=8.0 -isysroot $(xcrun --sdk ${SDK} --show-sdk-path)"
CHOST="arm-apple-darwin"
PREFIX="${HOME}/DEVICE_ARM"
dobuild
SDK="iphonesimulator"
ARCH_FLAGS="-arch x86_64"
HOST_FLAGS="${ARCH_FLAGS} -mios-simulator-version-min=8.0 -isysroot $(xcrun --sdk ${SDK} --show-sdk-path)"
CHOST="x86_64-apple-darwin"
PREFIX="${HOME}/SIM_x86"
dobuild
iOS ツールチェーンは SDK によって分離されており、iphonesimulator には macos、tvos、そしてもちろん iphoneos と同様に個別の SDK があります。SDK ごとに 1 つのコンパイルが必要です。iphonesimulator と iphoneos の出力には異なるアーキテクチャが含まれているため、1 つのライブラリにまとめることができますが、実際には同じ SDK でコンパイルされていません。混合 SDK のスーパー バイナリには反対することをお勧めします。
なぜ私はこれをしているのですか?
ライブラリをコンパイルしていてこれが必要な場合は、ライブラリが autoconf を使用しているか、Boost および OpenSSL の他のカスタム ビルド システムを使用していることが原因です。SDK 用にコンパイルするための鍵は、正しいclang
、-sysroot
、-miphoneos-ver-min
、および-arch
フラグです。-arch
または-sysroot
フラグを間違えると、#error Unsupported architecture
エラーが表示されます。
--disable-shared
フラグを削除します
静的ライブラリを使用するつもりでも、共有ライブラリの生成を残すのが好きです。これは通常、Position Independent Code (-fPIC) でコンパイルすることを意味するため、このライブラリを共有ライブラリに含めることにした場合は、問題ありません。また、リンクされていないがアーカイブされている静的ライブラリとは異なり、共有ライブラリをリンクすると、不足しているオブジェクトが公開されることがよくあります。
ライン上の複数のアーキテクチャ
行に複数のフラグを渡すことができ-arch
、FAT バイナリを取得できます。これにより、コンパイル中の手間と時間を節約できます。
$ lipo -info libwhatever.a
Architectures in the fat file: libwhatver.a are: i386 x86_64
アーキテクチャを削除
i386
正直なところ、サポートが必要ですか? そのデバイスを対象としていない場合は、アーキテクチャを含めないでください。ホストシステムが Lion より前の OS を実行している場合にのみ、i386 が必要です。