web-dev-qa-db-ja.com

makefileを介してgccフラグを渡す

llvm を使用してパスを構築しようとしていますが、llvmとそれに関連するコンポーネントの構築が完了しました。ただし、 makefile を含むパスを作成するためのすべての手順を実行した後にmakeを実行すると、次のようになります。

共有オブジェクトを作成する場合、「ローカルシンボル」に対する再配置R_X86_64_32は使用できません。 -fPICで再コンパイルします

エラーメッセージをグーグルで検索して修正を見つけるのに苦労した後、これはllvmに固有のものではないことがわかりました。いくつかの解決策は、configureの実行中に「--enable-shared」を使用することを提案しましたが、それは私の場合には役に立ちませんでした。エラーが示すように、fPICを使用してllvmを再構築したいと思います。しかし、makefileを使用してこれを行うにはどうすればよいですか?

16
Arjun Singri

シェル変数を設定することで、-fPIC(位置に依存しないコードの場合、任意のアドレスにロードできる共有ライブラリに必要なもの)を追加できるようです。

export CFLAGS="$CFLAGS -fPIC"
export CXXFLAGS="$CXXFLAGS -fPIC"

Makefile.rules を見ると、これらが取得されて使用されます。そもそもそこになかったのは奇妙に思えます。

編集:

実際、makefileで詳細を読むと、 LLVM Makefile Guide へのこのリンクが見つかりました。 Makefile.rulesから、MakefileでSHARED_LIBRARY = 1またはLOADABLE_MODULE = 1(SHARED_LIBRARYを意味する)を設定すると、コンパイラフラグに-fPICが配置されます。

12
Harold L

どこでも「-fPIC」を使用する必要があるとある程度確信している場合(または、より頻繁に必要な「-m32」または「-m64」)、「トリック」を使用できます。 :

CC="gcc -fPIC" ./configure ...

これは、Bourne/Korn/POSIX/Bashシェルを想定しており、configureスクリプトを実行する前に、環境変数CCを「gcc -fPIC」に設定します。これにより(通常)、すべてのコンパイルが指定されたフラグで実行されることが保証されます。コンパイルの正しい「苦味」を設定するために、これはあなたが見つける他のさまざまなメカニズムよりもうまくいくことがあります-使用するCコンパイラを指定したという事実を完全に無視しない限り、コンパイルがそれをくねくねするのは難しいです。

5

もう1つのオプションは、-fPICを直接渡して、次の方法で作成することです。

make CFLAGS='-fPIC' CXXFLAGS='-fPIC'
1
Datageek