web-dev-qa-db-ja.com

LLVM IRライブラリをUbuntuからiOS、Android、Windows、Macにクロスコンパイルする方法はありますか?

すべての依存関係とライブラリをLLVMIR形式で表現しています。 Linux(Ubuntuなど)からiOS、Android、Windows、Macプラットフォーム用の共有オブジェクトにライブラリをクロスコンパイルするにはどうすればよいですか?

4つのプラットフォームすべて(OpenCVやZeroMQ 4+など)で選択した別のライブラリに少なくとも1つの依存関係があるサンプルライブラリをコンパイルする単一のサンプルスクリプトを提供してください。

37
DuckQueen

LLVM静的コンパイラ (llc)を使用すると、LLVM IRを特定のターゲットトリプルのオブジェクトファイルにコンパイルできます。ターゲットトリプルは十分に文書化されていませんが、LLVMインフラストラクチャはすべてオープンソースであるため、ソースコードをすばやく検索すると ここ になります。

残念ながら、使用できるターゲットトリプルの個別のリストに関するドキュメントはありません。ただし、ターゲットにしているシステムが正確にわかっている場合は、トリプルの作成はかなり簡単です。 ターゲットトリプルドキュメント から取得すると、次のことがわかります。

トリプルの一般的な形式は<Arch><sub>-<vendor>-<sys>-<abi>です。ここで、

  • Arch = x86_64i386armthumbmipsなど。
  • sub =例ARMの場合:v5v6mv7av7mなど。
  • vendor = pcApplenvidiaibmなど。
  • sys = nonelinuxwin32darwincudaなど。
  • abi = eabignuAndroidmachoelfなど。

使用しているターゲットトリプルがわかったら、-mtripleフラグを使用して文字列として指定します。ここではいくつかの例を示します。

  • Windows:-mtriple=i686-pc-win32-gnu
  • Linux:-mtriple=i686-pc-linux-gnu
  • IOS:-mtriple=armv7-Apple-ios
  • Android:-mtriple=arm-linux-androideabi

次に、filetypeフラグを使用してオブジェクトファイルをコンパイルすることを指定する必要があります。

-filetype=obj

私があなたの質問を正しく理解していれば、これで十分でしょう。

すべてのプラットフォームとオペレーティングシステムで単一のファイルを使用することを期待している場合、これは可能ですが、多くの作業が必要になります。ここstackoverflowでそれに関する答えを期待しないでください。

19
ajkhoury