2016-12-18 13 views
0

私はいくつかのC++チームで構成されているプロジェクトで作業しています。各チームはライブラリを提供し、チームはこれらのライブラリをフロントエンドアプリケーションに統合しています。llvmライブラリの使用方法

アプリケーションはクロスプラットフォームなので、異なるプラットフォーム/ CPUアーキテクチャ/構成用にコンパイルされた同じ(静的な)ライブラリを別のチームが提供する必要があります。例えば。私たちはVisual Studio 2015/2013、32bit/64bit、linux、Debug/Releaseなどを持っています。

これらの静的ライブラリ「マニフェスト」の数を減らすのがいいでしょう。このアイデアは、静的ライブラリをLLVMのビットコードにコンパイルし、llvm-arツールを使用してllvm静的ライブラリを作成することです。特定のプラットフォームのバイナリを作成する必要がある場合、llc(LLVMプラットフォームコンパイラ)を使用してネイティブコード静的ライブラリを作成し、プラットフォームリンカとのリンクを行います。

質問:

  • 私が達成したいものを行うには良い方法はありますか?
  • llcは静的ライブラリのコンパイルをサポートしていないようで、個々の翻訳単位(.bc - > .o)のみをサポートしているようです。もちろん、個々のビットコードファイルを抽出し、ネイティブオブジェクトファイルにアセンブルし、プラットフォームライブラリアンツール(lib/ar)を使用して静的ライブラリを作成することもできますが、より合理的なソリューションがあるのだろうかと思います。
  • ゴールドリンカーは私が必要とするものを作るようですが、ELF形式に制限されているようです。私はWindows/Linuxや多分IOSをサポートする必要があります
+0

私が知る限り、LLVMのビットコードは依然としてマシンに依存しています。ライブラリとリンクをコンパイルする最良の方法は、 - enable-llvmと-flteフラグを指定してld/lldを使用することです。llvmビットコード形式のオブジェクトを選び、全体プログラム最適化を実行して最終バイナリにリンクします。 – berkus

+0

ビットコードがまだマシンに依存している理由を説明できますか?私は違いますが、私はCランタイムを使用するつもりです。 llvmのWebページでlldプロジェクトが見つかりました。残念ながら私はコマンドラインオプションのページに資金を提供していませんでしたが、f、l、t、eフラグが何をするのか説明できますか?通常のgnu ldコマンドラインでは、私はこれらのスイッチを見つけませんでした – user2281723

+0

詳細については下記のAntonの答えをご覧ください。 – berkus

答えて

1

LLVMはターゲット固有のプラットフォーム固有の言語(C/C++)から生成されたもので、ターゲットニュートラルにはなりません。 ABIの要件などを考えてください。プリプロセッサのような純粋なソースコードの機能は言及しません。だから、あなたが考えたアプローチはまったく動作しません。

詳細については、LLVM bitcode cross-platformを参照してください。

+0

リンクありがとうございます!私のアルゴリズムのすべての専門分野を避けるとどうなりますか?私たちが持っているのは、ほとんどが数値計算アルゴリズムなので、プラットフォーム依存のプリプロセッサマクロ、特別な呼び出し規則(stdcallなど)のような特殊なものは、cdeclを除いては期待されません。あなたがこれらのルールによって自分自身を制限すれば、それを行うことはまだ不可能/無駄だと思いますか? – user2281723

+0

たとえばあなたが使用している場合std :: vector - sizeof(size_t)またはsizeof(void *)について考える。 –

関連する問題