web-dev-qa-db-ja.com

「-fPICで再コンパイル」というエラーが発生する

./configure CentOSのアスタリスクmakeコマンドを入力しましたが、次のエラーが発生します

/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/liblua.a: could not read symbols: Bad value

私はこれを試しました./configure CFLAGS=-fPICしかし、上記と同じエラーが発生します。

4
Bilal

アスタリスクのこの時点で、動的ライブラリを構築しようとしています。この動的ライブラリは任意のメモリ位置にロードできるため、すべてを再配置可能にする必要があります。 -fPICフラグは位置独立コードを意味し、コードはロード場所に依存しないように作成されます-どこにでもロードされます。

このアスタリスクの動的libビルドの一部として、Luaインタープリターを取り込もうとしています。動的ライブラリに組み込まれているため、コンパイルされたすべてのPICが必要です。しかし、あなたはluaの静的ライブラリを使用しています。これはnot-fPICでビルドされました。静的ライブラリ内のluaオブジェクトは再配置できないため、これは拒否されます。

BTW:これが、アスタリスクビルドに-fPICを追加しても効果がない理由です。互換性がないのはアスタリスクコードオブジェクトではなく(-fPICが影響を与える可能性があります)、liblua.a、特にliblua.aによって運ばれるオブジェクト(例:lapi.o)です。さらに、その時点で動的ライブラリを構築しているので、その時点でまとめようとしているアスタリスクオブジェクト用の-fPICなどの再配置可能なコードフラグがすでにあると確信しています。

3つの解決策があります。

  • 1つは、ビルドからluaを削除することです。特にそれを必要とせず、「これは後で遊ぶのが楽しいかもしれない」ともっと考えていたなら、あなたは必要な機能を失うことなくできるかもしれません。

  • もう1つは、アスタリスクビルドで参照できるlibluaの動的バージョンliblua.soを取得することです。あなたのディストリビューションがわからないので、入手方法がわかりません。

  • もう1つは、お尻の1つでさらに苦痛なのは、-fPICを使用してluaとliblua.aを再構築することです。一貫性のないビルドフラグ(作成したものとディスク上にあるもの)が原因で互換性の問題が発生する可能性があるため、現在ビルドされているluaと一致するliblua.soを見つける方が良いオプションだと思います。

Liblua.soを見つけた場合は、このための「-rpath」リンカーフラグ、具体的には「-Wl、-rpath、/ path/to/lua/libs」を調べることをお勧めします。

5
Rich Homolka