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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。