2017-01-05 15 views
1

私のプロジェクトでは、静的なリンケージ用にコンパイルされたときにコードをコンパイルするときに定義を追加する必要があります。それが-DSTATIC_COMPILATIONと仮定しよう。Bazelビルドによる静的コンパイルのための特定のコンパイルフラグの送信

私の質問:リンケージバインディングに基づいて静的リンケージまたはコンパイルフラグを要求するときにコンパイルフラグを制御できますか?

は私が行うことができます知っていると存じ:

  1. bazel build --config=static_compを渡すことによって、このような構成を提供することができますbazelrcファイルの設定コマンドラインにbazel build
  2. --copt '-DSTATIC_COMPILATION'を追加 - いいですが、私は」このパッケージを外部パッケージとして使用するときに他のパッケージに渡すかどうかわかりません - ここで間違っている可能性があります...

私は何ですか? ssing?

答えて

1

短い答えは、コードが静的にまたは動的にリンクされるかどうかに基づいてフラグを設定する方法がBazelに存在しないことです。

Bazelのcc_libraryは、ダイナミックリンクのためにPICが必要なアーキテクチャでコードを2回コンパイルしますが、にはのPICが必要です。これは、PIC以外のコードが一般的に高速であるため、静的にリンクされた実行可能ファイルのパフォーマンスのために主に行われます。

bazelのcc_testルールはデフォルトで動的にリンクされていますが、cc_binaryルールはデフォルトで静的にリンクされているため、PIC/no-PICの区別にはほとんどすべてのC/C++ソースコードをダブルコンパイルする必要があります。 PIE実行可能ファイルにはPICコンパイル済みコードが必要なので、PIE実行可能ファイルが必要なASLRが必要な場合は、コードは常にPICとしてコンパイルされます。

しかし、PIC/no-PICのサポートはcc_libraryにハードコードされており、あなたが望むことをするためにそれを「乱用する」明白な方法はありません。おそらく、アーチがダイナミックリンクのためにPICを必要とするが、静的リンクは必要ないと宣言するためにクロスコンパイルをハックアップして、どちらの場合もPICで宣言し、追加のフラグも設定することができます。これにより、.pic.oおよび.o出力ファイルが生成されますが、両方ともPICコードが含まれます。これは、クロスツールを制御できない場合は実行できません。これを行うことはお勧めしません。

しかし、あなたが望むものを達成するための他の方法があるかもしれません。なぜ静的にリンクされたコードの特殊なケースが必要なのかを精緻化していますか?

+0

これらの定義が存在する理由は、動的および静的リンケージのコードが少し違うようにするためです。これは、実行時に動的にライブラリをロードすることに関連しています。静的フレーバーの場合、ライブラリーはロードされず、ロードされてはいけませんが、コードは呼び出す関数を見つける必要があります。 –

関連する問題