banner
李大仁博客

李大仁博客

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

[iOS] Makefile交叉コンパイル静的ライブラリTA-lib

Cocoa-Charts がクライアントデータの計算をサポートするために、Cocoa-Charts に技術分析データの計算機能を追加する必要があります。現在、一般的に使用されているのは TA-lib ですが、TA-lib には iOS バージョンの静的ライブラリファイルが提供されていないため、iPhone シミュレータと iPhone 本体に対応した TA-lib の静的ライブラリを X86 プラットフォームでクロスコンパイルする必要があります。これにより、TA-lib を ARMv7、ARMv7s、i386 などの複数の iPhone モデルやシミュレータのシステムアーキテクチャでデバッグや iOS アプリケーションの開発に使用できるようになります。

技術的な背景を理解しましょう:
TA-Lib:金融市場データの技術分析を実行する必要がある取引ソフトウェア開発者に広く使用されているコンポーネントです。プロジェクトのウェブサイトは:http://www.ta-lib.org/ です。
TA-Lib は、ADX、MACD、RSI、ストキャスティクス、ボリンジャーバンドなどの 200 以上の指標を含んでいます(詳細はこちら)。
ローソク足パターン認識
C/C++、Java、Perl、Python、100%マネージド.NET 用のオープンソース API

クロスコンパイル:1 つのプラットフォームで別のプラットフォーム上で実行可能なコードを生成することです。ここで注意する必要があるのは、プラットフォームという言葉は、実際には 2 つの概念、アーキテクチャ(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} です"
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
#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 を使用して 3 つのバージョンを結合する

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

  1. iPhone モデルに対応する ARM バージョン

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

参考 URL
http://www.verydemo.com/demo\_c137\_i56517.html

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。