杰里米给出了一个很好的答案,但我想补充一些东西并提供我的两分钱。
更新的脚本
#!/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,您都需要进行一次编译。您可以将 iphonesimulator 和 iphoneos 输出合并到一个库中,因为它们包含不同的架构,但实际上它们不是使用相同的 SDK 编译的。我建议不要使用混合 SDK 的超级二进制文件。
我为什么要这样做?
如果您正在编译一个库并且需要它,那是因为该库正在使用 autoconf,或者在 Boost 和 OpenSSL 的情况下使用其他自定义构建系统。为 SDK 编译的关键是正确clang
的 、-sysroot
、-miphoneos-ver-min
和-arch
标志。如果你弄错了-arch
or-sysroot
标志,你会看到#error Unsupported architecture
错误。
删除--disable-shared
标志
即使我打算使用静态库,我也喜欢留下共享库的生成。这通常意味着您将使用位置无关代码 (-fPIC) 进行编译,因此如果您决定将此库包含在共享库中,那么您就可以开始了。此外,与未链接但存档的静态库不同,共享库的链接通常会暴露丢失的对象。
多种架构上线
您可以在线传递多个-arch
标志,您将获得 FAT 二进制文件。这可以在编译期间为您节省一些麻烦和时间。
$ lipo -info libwhatever.a
Architectures in the fat file: libwhatver.a are: i386 x86_64
移除架构
老实说,您需要i386
支持吗?如果您不针对该设备,则不要包含架构。如果您的主机系统运行的操作系统早于 Lion,则您只需要 i386。