私はコマンドを使用しています:
_g++ --std=c++11 -fPIC -Iincludes parser.cpp lib/main-parser.o lib/lib.a
_
Debian 9でC++プログラムをコンパイルします。しかし、次のエラーメッセージが表示されます。/usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status
私はすでにスレッドを見ました: 「。rodata.str1.8に対する再配置R_X86_64_32は共有オブジェクトの作成時に使用できません」でコンパイルが失敗します
ただし、_-fPIC
_引数を追加しようとしましたが、奇妙なことに「-fPICで再コンパイル」と同じエラーメッセージが表示されます
任意のアイデアをいただければ幸いです。私は大学のRedHatシステムでこれをコンパイルしようとしましたが、そこでうまく動作します。依存関係が欠落している可能性があると考えていますが、答えが見つかりませんでした。
前もって感謝します
Gccは位置に依存しない実行可能ファイルを生成しようとしているように見えるので、次のことを行わないでください。
g++ --std=c++11 -no-pie -Iincludes parser.cpp lib/main-parser.o lib/lib.a
g++
は、システムでデフォルトで位置に依存しない実行可能ファイルを生成するようです。他のシステムでは、-pie
が必要です。 -no-pie
を使用すると、「通常の」(位置依存)実行可能ファイルが作成されます。
/usr/bin/ld: lib/lib.a(csdocument.o): relocation R_X86_64_32 against '.rodata' \
can not be used when making a shared object; recompile with -fPIC
このリンカエラーは、静的ライブラリcsdocument.o
のオブジェクトファイルlib/lib.a
が位置独立コードではないため、PIEプログラムとリンクできないことを示しています。したがって、lib/lib.a
のソースファイルを-fPIC
で再コンパイルし、静的ライブラリを再構築してから、PIEプログラムにリンクする必要があります。ライブラリのソースを管理できない場合は、サプライヤーにPICビルドをリクエストしてください。
(他の人は、なぜ共有ライブラリではないのでPIEターゲットを構築する必要があるのか疑問に思っています。Debian9では、GCCは デフォルトではPIE実行可能ファイル を生成します。 17.04時点のUbuntu)
これを追加するとうまくいきました。
g++ --std=c++11 -no-pie
コンパイルフラグに-fPIC
も追加しました。