李大仁博客

[iOS]Makefile交叉编译静态库TA-lib

为了使Cocoa-Charts支持客户端数据计算,需要为Cocoa-Charts增加技术分析数据计算功能,目前比较通用的是TA-lib,但是TA-lib没有提供iOS版本的静态库文件,因此需要在X86平台上交叉编译适用于iPhone模拟器和iPhone真机的TA-lib静态库,用于调试和开发iOS应用程序,使TA-lib支持ARMv7 ARMv7s i386等系统架构的多种iPhone机型或模拟器。

了解一下技术背景:
TA-Lib:一个被贸易软件开发人员广泛使用的组件,用来对金融市场的数据进行技术分析。项目网址是:http://www.ta-lib.org/
TA-Lib is widely used by trading software developers requiring to perform technical analysis of financial market data.
Includes 200 indicators such as ADX, MACD, RSI, Stochastic, Bollinger Bands etc… (more info)
Candlestick pattern recognition
Open-source API for C/C++, Java, Perl, Python and 100% Managed .NET

交叉编译:就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓 平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

编译环境:
MAC OS X v10.8.5
XCode 4.6
LLVM GCC 4.2
如果需要在Xcode5上编译,需要注意GCC的调整,请参考博客上一篇博文。

下面开始进行交叉编译,以下代码可以适用于编译其他静态库。
执行脚本ios-build.sh,脚本内容如下:

configure_build() {
export PLATFORM=$1
#export PLATFORM=iPhoneOS
echo "Platform is ${PLATFORM}"
if [ "$PLATFORM" == "iPhoneSimulator" ]; then
export ARCHITECTURE=i386
export ARCH=i686-apple-darwin12.5.0
#export ARCH=x86_64-apple-darwin12.5.0
fi
if [ "$PLATFORM" == "iPhoneOS" ]; then
export ARCHITECTURE=$2
export ARCH=arm-apple-darwin12.5.0
fi

export ARCH_PREFIX=$ARCH-
export SDKVER="6.1"   #
export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"
export PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export RANLIB="$DEVROOT/usr/bin/ranlib"
#export CPP="$DEVROOT/usr/bin/c++"
#export CXXCPP="$DEVROOT/usr/bin/c++"
export CC="$DEVROOT/usr/bin/gcc"
export CXX="$DEVROOT/usr/bin/g++"
export LD="$DEVROOT/usr/bin/ld"
export STRIP="$DEVROOT/usr/bin/strip"
export LIBRARY_PATH="$SDKROOT/usr/lib"

export CPPFLAGS=""
#export CFLAGS="-arch armv7 -fmessage-length=0 -pipe -fpascal-strings -miphoneos-version-min=4.0 -isysroot=$SDKROOT -I$SDKROOT/usr/include -I$SDKROOT/usr/include/c++/4.2.1/"
export CFLAGS="-arch ${ARCHITECTURE} -fmessage-length=0 -pipe -fpascal-strings -miphoneos-version-min=4.0 -isysroot=$SDKROOT -I$SDKROOT/usr/include -I$SDKROOT/usr/include/c++/4.2.1/"

export CXXFLAGS="$CFLAGS"
#export LDFLAGS="-isysroot='$SDKROOT' -L$SDKROOT/usr/lib/system -L$SDKROOT/usr/lib/"
export LDFLAGS="-arch ${ARCHITECTURE} -isysroot='$SDKROOT' -L$SDKROOT/usr/lib/system -L$SDKROOT/usr/lib/"

./configure --host=${ARCH} --with-protoc=protoc --enable-static --disable-shared
}

编译i386版本libTA-i386.a

mkdir ios-build
#build for iPhoneSimulator
configure_build iPhoneSimulator
make clean
make
cp src/.libs/libTA.a ios-build/libTA-i386.a

编译armv7版本libTA-armv7.a

configure_build iPhoneOS armv7
make clean
make
cp src/.libs/libTA.a ios-build/libTA-armv7.a

编译armv7s版本libTA-armv7s.a

configure_build iPhoneOS armv7s
make clean
make
cp src/.libs/libTA.a ios-build/libTA-armv7s.a
make clean

使用lipo合并三个版本

xcrun -sdk iphoneos lipo \ 
      -arch armv7 ios-build/libTA-armv7.a \
      -arch armv7s ios-build/libTA-armv7s.a \
      -arch i386 ios-build/libTA-i386.a \
      -create -output ios-build/libTA-all.a

将生成的libTA-all.a导入到Xcode工程,即可在Xcode上模拟器版本和真机版本中使用。

参考资料
1.Darwin版本与OS X的关系

Darwin 11.0.0 Mac OS X v10.7
Darwin 11.4.0 Mac OS X v10.7.4
Darwin 11.4.2 Mac OS X v10.7.5
Darwin 12.0.0 OS X v10.8
Darwin 12.3.0 OS X v10.8.2
Darwin 12.4.0 OS X v10.8.4
Darwin 12.5.0 OS X v10.8.5

2.iPhone机型对应ARM版本

armv6 iPhone 2G, iPhone 3G
armv7 iPhone 3GS, iPhone 4, iPhone 4s
armv7s iPhone 5, iPhone 5C
armv64 iPhone 5s

参考网址
http://www.verydemo.com/demo_c137_i56517.html

Exit mobile version