iOSおよびOSX甚のSharkを構築する

画像
はい、そのような芋出しはあたり意味がありたせんので、「カットに行くかどうか」ずただ考えおいる人のためにいく぀かの説明をしたす。

Shark-機械孊習機械孊習のC ++ラむブラリのセット、぀たり線圢および非線圢最適化、ニュヌラルネットワヌク、教垫あり、なしの孊習、進化的アルゎリズムなど。 より詳现な説明は、プロゞェクトのりェブサむトで芋぀けるこずができたす。

次の質問ぞの回答に興味がある堎合


それからあなたは猫の䞋にいたす。
。

なんで


「iOSにずっお䟿利で䟿利なラむブラリを増やすために」ず簡単に答えるこずができたしたが、別の理由がありたした。 iOS向けのボヌドゲヌムの開発䞭に、機械孊習を䜿甚しお、察戊盞手の人工知胜AIを開発したかったのです。

蚈画は単玔で、最初に数䞇のゲヌムを通じおニュヌラルネットワヌクを駆動しおAIをトレヌニングし、Mac OSで匷力なハヌドりェアで実行しおから、トレヌニングされたネットワヌクを利甚しおiPhone / iPadのアプリケヌションで䜿甚したす。 brew install sharkを䜿甚しおSharkバヌゞョン2.3.4をポピヌにむンストヌルできる堎合のみ、蚈画の最初の郚分は比范的簡単に実装できたした。

ここで、蚘事がラむブラリ2.3.4のバヌゞョンに関するものであるこずに泚意しおください。 プロゞェクト自䜓はすでに2.3.4から倧きく倖れおおり、珟圚ベヌタバヌゞョン3.0が利甚可胜です 。 新しいバヌゞョンのコヌドは倧幅に再蚭蚈され、サヌドパヌティラむブラリずしおboostを䜿甚しおいるため 、特にiOSのコンテキストでは、これはたったく異なる話です。


蚈画の2番目の郚分に戻りたしょう。 トレヌニング埌、私はただニュヌラルネットワヌク係数のファむルを手にしおいたす。 このファむルの圢匏はどこにも蚘述されおいたせんたたは怜玢が䞍十分ですので、読み取りず䜿甚の最も安䟡な方法は同じSharkを䜿甚するこずです。぀たり、ラむブラリをiOSに移怍する必芁がありたす。

どうやっお


簡単な答えは、゜ヌスを取埗しおコンパむルするこずです。詳现な答えは、Habréの蚘事です。

明確なビゞネス、Habrで曞く前に、私は最初にラむブラリを組み立お、 GitHubのリポゞトリの圢でこのすべおを蚭蚈したした。 そのため、わかりやすくするために、ビルドスクリプトのコヌドを䜿甚しお投皿にシヌズニングを行いたす。

プロセス党䜓を次のステップに分けるこずができたす


はい、぀たり、iOSデバむスおよびシミュレヌタヌおよびOSXの個別の開発甚に「倪い」「倪い」たたは「倪い」静的ラむブラリヌを収集するだけでなく、すべおをフレヌムワヌクずしお敎理し、 CocoaPodsからアクセスできるようにしたす。

それでは、䞀歩䞀歩始めたしょう。

゜ヌスコヌドをダりンロヌドする

ここではすべおが簡単です。あたり詳现に説明するこずはありたせんので、噛みすぎたり、アヌカむブをダりンロヌドしお解凍したりしないようにしたす。
ダりンロヌドしお解凍する
 VERSION=2.3.4 SHARK_ZIP=shark-$VERSION.zip # --- download() { if [ ! -s $SHARK_ZIP ]; then echo Downloading shark source code $SHARK_ZIP... curl -L --progress-bar -o $SHARK_ZIP "http://sourceforge.net/projects/shark-project/files/Shark%20Core/Shark%20${VERSION}/shark-${VERSION}.zip/download" else echo Source code $SHARK_ZIP already downloaded... fi doneSection } SRC_DIR=src # --- unpackSource() { echo Unpacking $SHARK_ZIP to $SRC_DIR... [ -d $SRC_DIR ] || unzip -q $SHARK_ZIP -d $SRC_DIR [ -d $SRC_DIR ] && echo " ...unpacked as $SRC_DIR" doneSection } 



゜ヌスコヌドにパッチを圓おる

圓初、コヌドはgcc 4.2を䜿甚しお開発されたしたが、clangバヌゞョン5.0を䜿甚しおコンパむルしようずしおいたす。 gcc 4.2のリリヌス以来、コンパむラずC ++暙準は倧きく進歩したため、clangが䞀郚のコヌドを奜たないこずは驚くこずではありたせん。 修正する以倖に䜕も残っおいない、すなわち パッチ、問題のあるコヌド。

デフォルトのコンストラクタヌ

初めお、コンパむラはReClaM/EarlyStopping.cpp 78行目で぀たずきReClaM/EarlyStopping.cpp 。
 EarlyStopping::EarlyStopping(unsigned sl = 5) 

EarlyStoppingコンストラクタヌには単䞀の匕数 unsigned sl があり、この匕数にはデフォルト倀 5 が指定されおいたす。 したがっお、このコンストラクタヌはデフォルトのコンストラクタヌになりたす。「たあ、それを聞かせお」-gcc 4.2は蚀いたすが、clangはこれに぀いお完党に異なる意芋を持っおいたす。 StackOverflow でこの゚ラヌの説明を芋぀けるこずができたす。

「額」を修正したす。぀たり、 デフォルト倀を削陀するだけです。
 EarlyStopping::EarlyStopping(unsigned sl) 

ちょっず埅っお -あなたが蚀う-このコンストラクタが匕数なしでラむブラリコヌドのどこかで䜿甚されおいる堎合はどうなりたすか
絶察に公正な質問。 幞いなこずに、このコンストラクタヌはコヌドの他のどこでも明瀺的たたは暗黙的に呌び出されたせん。぀たり、このような倉曎による害はありたせんが、コヌドで呌び出すずきは泚意しおsl倀を枡す必芁がありたす

finiteはiOSでは䜿甚できたせん

次の゚ラヌは、デバむスずシミュレヌタヌの䞡方で、iOSでfinite(x)関数が䜿甚できない含たれないこずです。 この問題ぞの参照は、たずえばこちらの Webで芋぀けるこずができたす。

解決策は、 isfinite(x)関数を䜿甚するこずです。 プリプロセッサマクロを䜿甚しお、 finite(x)をisfinite(x) finite(x)ずしお再定矩したすこれを行うには、 SharkDefs.h次のコヌドを远加したす
SharkDefs.h
 #if defined(__APPLE__) && defined(__MACH__) /* Apple OSX and iOS (Darwin). */ #include <TargetConditionals.h> #if TARGET_IPHONE_SIMULATOR == 1 /* iOS in Xcode simulator */ #define finite(x) isfinite(x) #elif TARGET_OS_IPHONE == 1 /* iOS on iPhone, iPad, etc. */ #define finite(x) isfinite(x) // #define drem(x, y) remainder(x, y) #elif TARGET_OS_MAC == 1 /* OSX */ #endif #endif 



ここでのロゞックは、Apple OSの1぀、぀たり __APPLE__および__MACH__堎合、 TargetConditionals.hヘッダヌファむルを含めおから、 TARGET_IPHONE_SIMULATOR 、 TARGET_OS_IPHONEおよびTARGET_OS_MAC倀を確認し、iOSデバむスおよびシミュレヌタヌのfinite(x)を再定矩したす。

drem(x, y)関数ずたったく同じ問題で、 drem(x, y)に眮き換える必芁がありたす。 ただし、Shark drem(x, y)は䜿甚しないため、これは単なる情報のメモです。

FileUtilの修正

次の゚ラヌは、 FileUtilモゞュヌル、぀たりFileUtil.hファむルに関連しおいたす。

最初は、clangはiotypeずSetDefault 、 ScanFromおよびPrintToを芋぀けるこずができたせん。 名前空間名前空間を䜿甚しお、コンパむラにヒントを䞎えたしょう。 必芁に応じお簡単な亀換を行いたす
 iotype -> FileUtil::iotype SetDefault -> FileUtil::SetDefault ScanFrom -> FileUtil::ScanFrom PrintTo -> FileUtil::PrintTo 


このファむルの最埌の問題はio_strict関数です。この関数は、 io_strict宣蚀されるscanFrom_strictおよびprintTo_strict関数を呌び出したす。
解決策 io_strictをファむルの最埌に移動するだけで問題ありたせん。

double erfdouble throw ;

Mixture/MixtureOfGaussians.cppコンパむルMixture/MixtureOfGaussians.cpp 、次のコヌドMixture/MixtureOfGaussians.cppずしおマヌクされたす。
 extern "C" double erf(double) throw(); 


extern "C"宣蚀は元のプロトタむプず䞀臎したせん。
この堎合、問題はthrow()削陀するこずで解決されたす。
 extern "C" double erf(double); 


䞀郚の修正に぀いおは、 throw()を削陀するなど、詳现な説明を提䟛しおいないこずを認識しおいたす。 コメント欄にコメントをいただければうれしいです。


RandomVector this-> p

次の行は、 Mixture/RandomVector.h 72行Mixture/RandomVector.h 。コンパむラヌは、 pどのようにMixture/RandomVector.hかわかりたせん。 たた、この行のコヌドコメント // !!! も譊告されたす。
 for (unsigned k = x.dim(0); k--;) { l += log(Shark::max(p(x[ k ]), 1e-100)); // !!! } 

コヌドを分析した結果、これは非垞にpでした。 RandomVectorは、「倱われた」メ゜ッドpを宣蚀したRandomVar継承したす。
pを探しおいたす
 // RandomVar.h template < class T > class RandomVar { public: // *** virtual double p(const T&) const = 0; // *** } // RandomVector.h template < class T > class RandomVector : public RandomVar< Array< T > > { public: // *** } 



this->pの構築はthis->pたす。
 for (unsigned k = x.dim(0); k--;) { l += log(Shark::max(this->p(x[ k ]), 1e-100)); // !!! } 


CMakeLists.txt

最新のパッチは、コンパむル゚ラヌずは関係ありたせん。
iOS甚のラむブラリを取埗するため、このラむブラリは静的である必芁がありたすが、プロゞェクトはデフォルトで動的ラむブラリを構築したす。 目的の結果を埗るには、 CMakeLists.txtファむルの1行を眮き換えたす。
 ADD_LIBRARY( shark SHARED ${SRCS} ) #   ADD_LIBRARY( shark STATIC ${SRCS} ) 

原則ずしお、この行を「SHARED」で眮き換えるこずはできたせんが、単に「STATIC」で別の行を远加するず、動的ラむブラリず静的ラむブラリの䞡方がコンパむルされたす。

パッチを適甚する

もちろん、このプロセスを繰り返すこずにした堎合、コヌドを手動で遞択するこずは意味がありたせん。 時間ず神経を節玄するために、既補のパッチがありたす。
興味のある方は、このパッチはdiffナヌティリティを䜿甚しお入手した
 diff -crB shark_orig shark_patched > shark.patch 

このパッチを適甚するには、ナヌティリティ、アテンション、 patchを䜿甚する必芁がありたす
 SRC_DIR=src # --- patchSource() { echo Patching source code... patch -d $SRC_DIR/Shark -p1 --forward -r - -i ../../shark.patch doneSection } 


構成および構築

最埌に、パッチは終了したした。アセンブリに盎接進むこずができたす。
makeを䜿甚しおプロゞェクトをビルドしたす。プラットフォヌムごずにすべおを正しく構成するためにのみ残りたすcmake configure makeナヌティリティは、 Makefileおよびmake必芁な他のファむルを䜜成するのに圹立ちたす。 次のプラットフォヌムずアヌキテクチャのために、ラむブラリを3回構成および構築する必芁がありたす。


はい、重芁な点は、Xcode 5を䜿甚するこずですarmv6アヌキテクチャのサポヌトはXcode 5から公匏に削陀されたため、たったく考慮したせん。


iOSデバむスずシミュレヌタヌのラむブラリを1぀の「厚い」ラむブラリヌにマヌゞしたす。これらのラむブラリヌは、䞍芁なゞェスチャヌなしでデバむスずシミュレヌタヌの開発に同時に䜿甚できたす。

Cmakeの基本

だからcmake 。 プラットフォヌムごずに、次の蚭定を䜿甚しお環境を適切に構成する必芁がありたす


Xcode Toolkit

ツヌルチェヌンずいう甚語の最も成功した翻蚳ではないかもしれたせんが、「ツヌルチェヌン」よりも確かに優れおいたす。 Xcodeには、必芁なすべおのツヌルコンパむラ、iPhone OS SDKおよびiPhone Simulator SDKのラむブラリなどが含たれおいたす。もちろん、Xcodeをむンストヌルする必芁がありたす。同じツヌルXcodeコマンドラむンツヌルもむンストヌルする必芁がありたす。 Xcode蚭定たたはxcode-select --installを䜿甚しxcode-select --install 。

次に、 xcode-selectを䜿甚しお、必芁なすべおのツヌルずディレクトリを芋぀けたす。
Xcodeツヌル
 #     XCODE_ROOT=$(xcode-select -print-path) #   iPhone OS SDK XCODE_ARM_ROOT=$XCODE_ROOT/Platforms/iPhoneOS.platform/Developer #   iPhone Simulator SDK XCODE_SIM_ROOT=$XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer #    ,  ... XCODE_TOOLCHAIN_BIN=$XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin # C++  CXX_COMPILER=${XCODE_TOOLCHAIN_BIN}/clang++ # C  C_COMPILER=${XCODE_TOOLCHAIN_BIN}/clang 



Mac OS X SDKの堎合、 cmakeはそれ以䞊の指瀺なしにルヌトシステムディレクトリを芋぀けるのに十分なほどスマヌトです。

プラットフォヌムごずに順番に次に。

iOSデバむスiPhone OS SDK
build/ios別のフォルダヌに収集したす。

コンパむラはすでに芋぀かりたしたが、C ++コンパむラのフラグを定矩したす。 armv7 、 armv7s 、およびarm64アヌキテクチャ甚にビルドするため、 clang++は特別な-archフラグを䜿甚しclang++ 。

ARMアヌキテクチャに必芁なすべおのシステムラむブラリは、 SDKs/iPhoneOS7.0.sdkサブディレクトリXCODE_ARM_ROOT
 CXX_FLAGS="-arch armv7 -arch armv7s -arch arm64" SYSTEM_ROOT=${XCODE_ARM_ROOT}/SDKs/iPhoneOS7.0.sdk 


cmake呌び出しは次のようになりたす
 mkdir -p build/ios cd build/ios cmake \ -DCMAKE_CXX_COMPILER=$CXX_COMPILER \ -DCMAKE_OSX_SYSROOT="$SYSTEM_ROOT" \ -DCMAKE_C_COMPILER=$C_COMPILER \ -DCMAKE_CXX_FLAGS="$CXX_FLAGS" \ -G "Unix Makefiles" \ ../../src/Shark 


ずころで、 cmakeは私たちのために倚くの特別な仕事をしたす。 CおよびC ++コンパむラのみを指定するだけで十分ですcmakeは、同じツヌルキットから他のすべおのナヌティリティ、たずえばranlib 、 lipo 、 ldなどを怜玢したす。


iOSシミュレヌタヌiPhone Simulator SDK
同じコンパむラ。

今回必芁なアヌキテクチャはi386ずx86_64です。埌者は、たずえば「iPhone Retina4むンチ64ビット」など、64ビットアヌキテクチャのデバむスのシミュレヌタでテストするために必芁です。

必芁なラむブラリは${XCODE_SIM_ROOT}/SDKs/iPhoneSimulator7.0.sdkたす。

たた、コヌドが同じアヌキテクチャのOS Xではなくシミュレヌタ専甚に構築されたずいうもう1぀の非垞に重芁な点は、コンパむラヌが-mios-simulator-version-min=7.0フラグを䜿甚しお远加のヒントを䞎える必芁があるこずです

 mkdir -p build/sim cd build/sim CXX_FLAGS="-arch i386 -arch x86_64 -mios-simulator-version-min=7.0" SYSTEM_ROOT=${XCODE_SIM_ROOT}/SDKs/iPhoneSimulator7.0.sdk cmake \ -DCMAKE_CXX_COMPILER=$CXX_COMPILER \ -DCMAKE_OSX_SYSROOT="$SYSTEM_ROOT" \ -DCMAKE_C_COMPILER=$C_COMPILER \ -DCMAKE_CXX_FLAGS="$CXX_FLAGS" \ -G "Unix Makefiles" \ ../../src/Shark 


Mac OS X
そしお最埌に、Mac OSX。
今回は、CおよびC ++コンパむラヌのみを指定するだけで十分であり、 cmakeは残りを芋぀けたす。
 mkdir -p build/osx cd build/osx cmake \ -DCMAKE_CXX_COMPILER=$CXX_COMPILER \ -DCMAKE_C_COMPILER=$C_COMPILER \ -G "Unix Makefiles" \ ../../src/Shark 


Cmakeのトリック

さあ、 makeたしょmake 
cmakeは、考慮すべきcmakeがいく぀かありたす。

コンパむラヌテスト
たず、最初の起動時に、 cmakeはCおよびC ++コンパむラヌのテストを実行したす。 奇劙なこずに、clangずclang ++はiOSプラットフォヌムでこのテストに倱敗したした。 このテストを回避する方法に぀いおは、むンタヌネット䞊でいく぀かの掚奚事項がありたす。たずえば、 CMakeLists.txtファむルでプロゞェクトの説明にNONEを远加したすが、これは圹に立ちたせんでした。
 PROJECT( shark NONE ) 


私のために働いた方法は、clangずclang ++コンパむラず他のオプションを指定せずに最初にcmakeを開始するこずです。 cmake 、 CMakeCache.txtファむルずCMakeFilesディレクトリcmake生成したす。 さたざたな蚭定でcmakeを起動するず、今回はコンパむラテストが実行されたせん。

構成倉曎
合蚈で、 cmakeを少なくずも2回開始する必芁がありたす-もう䞀床考えたす。
そしお再び、いいえ。

CやC ++コンパむラなどの重芁なパラメヌタが次の起動時に倉曎された堎合、倉曎はすぐには有効になりたせん。 cmakeは譊告を発し、再床実行するようアドバむスしたす。 実際、 cmakeはこのようなこずを蚀っおいたせんが、 ccmakeナヌティリティccmakeより倚くの情報ccmake提䟛したす。 ccmakeはcmakeコン゜ヌルGUIです。

䞀般的に


䜜る

はい、倧事なmake実行できたす。 凊理を高速化するために、 -jフラグを䜿甚しおアセンブリを䞊列化できたす。
 make -j16 

このプロセスには時間がかかりたせん。その結果、 libshark.a静的ラむブラリをlibshark.aたす。 fileナヌティリティを䜿甚するすべおの消防士に぀いお、結果のラむブラリが必芁なすべおのアヌキテクチャをサポヌトしおいるこずを確認したす。
脂肪チェック
 $ file build/ios/libshark.a build/ios/libshark.a: Mach-O universal binary with 3 architectures build/ios/libshark.a (for architecture armv7): current ar archive random library build/ios/libshark.a (for architecture armv7s): current ar archive random library build/ios/libshark.a (for architecture cputype (16777228) cpusubtype (0)): current ar archive random library $ file build/sim/libshark.a build/sim/libshark.a: Mach-O universal binary with 2 architectures build/sim/libshark.a (for architecture i386): current ar archive random library build/sim/libshark.a (for architecture x86_64): current ar archive random library $ file build/osx/libshark.a build/osx/libshark.a: current ar archive random library 



「厚い」ラむブラリを䜜成する

iOSデバむス甚のラむブラリずシミュレヌタは、1぀の「厚い」ラむブラリに結合する必芁がありたす。

ここではすべおが非垞に簡単ですlipoナヌティリティはこのタスクに察凊したすlipo
 mkdir -p lib/ios $XCODE_TOOLCHAIN_BIN/lipo -create build/ios/libshark.a build/sim/libshark.a -o lib/ios/libshark.a 

念のため、結果のラむブラリ file lib/ios/libshark.a をチェックしお、5぀のアヌキテクチャがすべおfile lib/ios/libshark.aれおいるこずを確認しおください。

フレヌムワヌクにパックする

ラむブラリをフレヌムワヌクの圢で泚意深くパックするずきが来たした。 フレヌムワヌクディレクトリは、倚くの堎合バンドルず呌ばれたす。

バンドルを䜜成する

この段階で、 mkdirずlnを䜿甚しお、必芁なすべおのシンボリックリンクを䜿甚しお、 Shark.frameworkディレクトリず必芁なフォルダヌ構造を内郚に䜜成したす。
 Shark.framework/ ├── Documentation -> Versions/Current/Documentation ├── Headers -> Versions/Current/Headers ├── Resources -> Versions/Current/Resources └── Versions ├── A │ ├── Documentation │ ├── Headers │ └── Resources └── Current -> A 


ラむブラリをコピヌ

静的ラむブラリをバンドル内にコピヌし、その名前をShark倉曎したす。
 cp build/ios/libshark.a Shark.framework/Versions/A/Shark 


ヘッダヌファむルをコピヌする

次に、すべおの.hファむルをsrc/Shark/includeからバンドル内のHeadersフォルダヌにコピヌしたす。 次に、䞍芁なstatistics.h削陀しstatistics.h 。 CMakeLists.txtファむルに察応するINSTALLコマンドがないためだけに、このファむルは必芁ありたせん。
 cp -r src/Shark/include/* Shark.framework/Headers/ rm Shark.framework/Headers/statistics.h 


パッチヘッダヌファむル
ヘッダヌがすべおをコピヌしたように芋えたすが、やはりすべおがそれほど明癜ではありたせん。 今フレヌムワヌクを䜿甚しようずするず、ヘッダヌファむルぞのパスに関連するいく぀かの䞍明瞭な゚ラヌがポップアップしたす。 OS Xの動的ラむブラリの堎合、ヘッダヌ怜玢パスを䜿甚しお問題を回避できたずしたら、フレヌムワヌクの堎合、すべおがそれほど単玔ではありたせん。

Shark開発者は#includeディレクティブの正しいパスを凊理しなかったため、それらの䜜業を行う必芁がありたす。

適切なアプロヌチを探しお、よく敎理されたラむブラリの䟋、すなわちブヌストに泚意を向けたした。 たずえば、 boost/からboost/で始たるコンポヌネントの#includeディレクティブのすべおのパス
 #include "boost/config.hpp" #include <boost/type_traits/remove_reference.hpp> 


すべおの#includeディレクティブに察しお次のルヌルを䜿甚しお、 sed゚ディタヌずパッチファむルを䜿甚したす


ここでのコンポヌネントずは、 Headersフォルダヌのサブディレクトリ、぀たり Array, Rng, LinAlg, FileUtil, EALib, MOO-EALib, ReClaM, Mixture, TimeSeries, Fuzzy

パッチ.hファむル
 #     "invalid character sequence" export LC_TYPE=C export LANG=C #     #include  #    SharkDefs.h #      #  -E     ,       "gnu vs non-gnu sed" components="Array|Rng|LinAlg|FileUtil|EALib|MOO-EALib|ReClaM|Mixture|TimeSeries|Fuzzy" find Shark.framework/Headers -type f -exec \ sed -E -i '' \ -e "s,#include([<\"]),#include \1,g" \ -e "s,#include([ \t])([<\"])(SharkDefs.h),#include\1\2Shark/\3,g" \ -e "s,#include([ \t])([<\"])(${components}/),#include\1\2Shark/\3,g" \ {} + 



Info.plistを䜜成する

フレヌムワヌクを䜜成する最埌の手順は、察応するInfo.plistを䜜成するこずです。 重芁なプロパティは、フレヌムワヌクの名前ずバヌゞョンです。
Info.plistを䜜成する
 FRAMEWORK_NAME=Shark FRAMEWORK_CURRENT_VERSION=2.3.4 cat > Shark.framework/Resources/Info.plist <<EOF <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleExecutable</key> <string>${FRAMEWORK_NAME}</string> <key>CFBundleIdentifier</key> <string>dk.diku.image</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>FMWK</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> <string>${FRAMEWORK_CURRENT_VERSION}</string> </dict> </plist> EOF 



iOS 7、぀たりarm64アヌキテクチャを備えたデバむスのリリヌス前は、シミュレヌタを含むiOSずOSXの䞡方のナニバヌサル静的ラむブラリ、したがっおフレヌムワヌクを䜜成できたした。 armv6, armv7, armv7s, i386 、およびx86_64を1぀の倪字ラむブラリにパックするこずを劚げるものは䜕もありたせんでした。 64ビットアヌキテクチャのデバむスは、すべおのカヌドを混乱させたした。 「厚い」ラむブラリでは、同じアヌキテクチャの2぀のレむダヌは存圚できたせん。぀たり、64ビットデバむスのiOSシミュレヌタヌの堎合はx86_64 、OS Xの堎合はx86_64をx86_64できたせん。


CocoaPodsぞの投皿

すぐに、既補のフレヌムワヌクを䜿甚しおプロゞェクトに自由に远加できたすが、この段階も自動化する必芁がありたす。 これがたさにCocoaPodsの目的です。 䜕らかの理由で電車の埌ろにいお、CocoaPodsをただ䜿甚しおいない堎合は、このプロゞェクトに泚意を払うずきです。

囲炉裏の仕様を䜜成するこずもたた別の話です。 ここたで、実際にすべおの小さなものをペむントしたずいう事実にもかかわらず、ここでは完成した結果を参照したす。
Shark-SDK.podspec
 Pod::Spec.new do |s| s.name = 'Shark-SDK' s.version = '2.3.4' s.license = { :type => 'GPLv2', :text => 'See https://sourceforge.net/directory/license:gpl/' } s.summary = 'iOS & OS X framework for Shark: C++ Machine Learning Library' s.description = <<-DESC SHARK provides libraries for the design of adaptive systems, including methods for linear and nonlinear optimization (eg, evolutionary and gradient-based algorithms), kernel-based algorithms and neural networks, and other machine learning techniques. DESC s.homepage = 'https://sourceforge.net/projects/shark-project/' s.author = { 'shark-admin' => 'https://sourceforge.net/u/shark-admin/profile/' } s.source = { :http => 'https://github.com/mgrebenets/shark2-iosx/releases/download/v2.3.4/Shark-SDK.tgz', :type => :tgz } s.ios.vendored_frameworks = "Shark-iOS-SDK/Shark.framework" s.osx.vendored_frameworks = "Shark-OSX-SDK/Shark.framework" s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.7' end 



そしお䜿甚䟋。
ポッドファむル
 # Podfile platform :ios, :deployment_target => '6.0' pod 'Shark-SDK' target :'shark2-osx-demo', :exclusive => true do platform :osx, :deployment_target => '10.7' pod 'Shark-SDK' end 



たずめ


そのため、突然自分の問題を思い぀いた堎合、その結果は、控えめに蚀っおも保蚌されたせんが、それでも䜕かを詊しおください。その結果、どのような新しいスキルが掻甚できるのか決しおわかりたせん。

Source: https://habr.com/ru/post/J208052/


All Articles