交叉编译libgcrypt静态库以供在iOS上使用
我从https://www.gnupg.org/download/index.html下载了最新的libgcrypt&libgpg-error库。 我使用./configure –enable-static –disable-shared成功构build了(命令行)这两个库。 制造 在我的Mac上安装(Mavericks w / OSX 10.10和最新的Xcode 6.1)。
我可以链接到这些新的库从我正在build立的OS X客户端应用程序。 到现在为止还挺好。 刚刚好。 但是,我也需要使用相同的源代码来构build一个iOS客户端。
问题:
1)我需要为(模拟器,Mac和iOS)构build通用静态库,需要对库的命令行构build序列进行哪些修改? 2)或者我需要为iOS构build单独的静态库? 如果是这样的话,那么我需要什么命令行的魔法来实现目标架构呢?
请注意,无法构build适用于iOS模拟器和macOS的通用库。 在C运行时库(Libc)之上,iOS / Intel和macOS / Intel不是ABI兼容的。 这个答案是为了向你展示如何为iOS目标交叉编译基于autoconf的项目,并且你可以轻松地将生成的静态档案放在一起。
你会想要做这样的事情:
#!/bin/bash -e -x OPT_FLAGS="-Os -g3" MAKE_JOBS=16 dobuild() { export CC="$(xcrun -find -sdk ${SDK} cc)" export CXX="$(xcrun -find -sdk ${SDK} cxx)" export CPP="$(xcrun -find -sdk ${SDK} cpp)" export CFLAGS="${HOST_FLAGS} ${OPT_FLAGS}" export CXXFLAGS="${HOST_FLAGS} ${OPT_FLAGS}" export LDFLAGS="${HOST_FLAGS}" ./configure --host=${CHOST} --prefix=${PREFIX} --enable-static --disable-shared make clean make -j${MAKE_JOBS} make install } SDK="iphoneos" ARCH_FLAGS="-arch armv7" 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="iphoneos" ARCH_FLAGS="-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_ARM64" dobuild SDK="iphonesimulator" ARCH_FLAGS="-arch i386" HOST_FLAGS="${ARCH_FLAGS} -mios-simulator-version-min=8.0 -isysroot $(xcrun -sdk ${SDK} --show-sdk-path)" CHOST="i386-apple-darwin" PREFIX="${HOME}/SIM_i386" 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_64" dobuild
我只是把这个脚本放在一起,并且validation了pixman的工作原理(增加了–disable-libpng和跳过testing)。 您可能需要为libgcrypt进行自定义,但是它可以显示为iOS构build基于autoconf / automake / glibtool的项目的一般模式。
在构build完成之后,您将拥有〜/ {DEVICE_ARM {,64},SIM_ {i386,x86_64}}中的内容,您可以将静态库合并在一起,也可以在项目中全部使用它们(链接器将发出警告缺less可以忽略的“其他”档案的切片)。
lipo -create -output lib.a DEVICE_ARM/lib/lib.a DEVICE_ARM64/lib/lib.a SIM_i386/lib/lib.a SIM_x86_64/lib/lib.a