banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[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

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.