76

静的ライブラリを共有ライブラリにリンクしようとしていますが、次のエラーが発生しています

/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(fileappender.o): 再配置 R_X86_64_32S は、共有オブジェクトを作成するときに「ローカル シンボル」に対して使用できません。-fPIC で再コンパイル
../../../libraries/log4cplus/liblog4cplus.a: シンボルを読み取れませんでした: 値が正しくありません
collect2: ld が 1 つの終了ステータスを返しました

しかし、これは32ビットマシンでそのようなエラーなしで機能しました。-fPIC問題を解決しなかった Makefile に手動でフラグを追加しようとしました

ここで-whole-archive提案されているようにフラグを試しましたが、成功しませんでした。

 
/usr/bin/ld: ../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): vtable for log4cplus::spi::AppenderAttachable に対する再配置 R_X86_64_32S は、共有オブジェクト; -fPIC で再コンパイル
../../../libraries/log4cplus/liblog4cplus.a(appenderattachableimpl.o): シンボルを読み取れませんでした: 値が正しくありません
collect2: ld が 1 つの終了ステータスを返しました

liblog4cplus.a の作成:

  1. unzip log4cplus-1.1.0.zip
  2. ./configure --enable-static=yes --enable-threads=yes
  3. vi Makefile-fPIC を CXXFLAGS と CFLAGS に追加
  4. make

次に、共有ライブラリをコンパイルします。

  1. g++ -frtti -w -c -fPIC -I"Include_Directory" myfile.cpp
  2. g++ -shared -fPIC -frtti -I"Include_Directory" -o mysofile.so myfile.o -Wl,--whole-archive "../../../libraries/log4cplus/liblog4cplus.a" -Wl,--no-whole-archive -ldl
4

5 に答える 5

115

共有ライブラリを生成していると仮定すると、おそらく、liblog4cplus.a使用している のバリアントが でコンパイルされていないことが起こります-fPIC。Linux では、静的ライブラリからオブジェクト ファイルを抽出し、それらの再配置を確認することで、これを確認できます。

ar -x liblog4cplus.a  
readelf --relocs fileappender.o | egrep '(GOT|PLT|JU?MP_SLOT)'

出力が空の場合、スタティック ライブラリは位置に依存せず、共有オブジェクトの生成には使用できません。

スタティック ライブラリには既にコンパイルされたオブジェクト コードが含まれているため、-fPIC フラグを指定しても役に立ちません。

liblog4cplus.aでコンパイルされたバージョンを入手し-fPIC、代わりにそれを使用する必要があります。

于 2013-11-04T13:06:48.220 に答える
3

次のような CCD lib(libccd) を必要とする FCL をインストールするときに、同様のエラーが発生しました。

/usr/bin/ld: /usr/local/lib/libccd.a(ccd.o): 共有オブジェクトを作成する場合、「ローカル シンボル」に対する再配置 R_X86_64_32S は使用できません。-fPIC で再コンパイル

「libccd.a」という名前の 2 つの異なるファイルがあることがわかりました。

  1. /usr/local/lib/libccd.a
  2. /usr/local/lib/x86_64-linux-gnu/libccd.a

最初のファイルを削除して問題を解決しました。

于 2014-04-20T20:29:02.823 に答える
3

未定義のシンボルに対する R_X86_64_PC32 の再配置は、通常、LDFLAGS がハードニングで設定され、CFLAGS が設定されていない場合に発生します。
おそらく単なるユーザー エラー:
リンク時に -specs=/usr/lib/rpm/redhat/redhat-hardened-ld を使用している場合は、-specs=/usr/lib/rpm/redhat/redhat-hardened も使用する必要があります。コンパイル時に -cc1 を追加し、同時にコンパイルとリンクを行っているため、両方が必要になるか、または -specs=/usr/lib/rpm/redhat/redhat-hardened-ld を削除します。一般的な修正:
https://bugzilla.redhat.com/show_bug.cgi?id=1304277#c3
https://github.com/rpmfusion/lxdream/blob/master/lxdream-0.9.1-implicit.patch

于 2016-07-26T01:32:14.800 に答える