1. ホーム
  2. c++

[解決済み] 共有オブジェクトの作成時に `.rodata.str1.8' に対する再配置 R_X86_64_32 は使用できません" でコンパイルに失敗する。

2022-02-07 23:18:43

質問事項

VPSでこのソースコードをmakefileからコンパイルしようとしているのですが、うまくいきません。VPSは64セントOSです。

以下はエラーの全文です。

# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be     used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1

以下は私のmakefileです。

GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"

COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/

all:
    $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
    $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
    $(GPP) $(COMPILE_FLAGS) *.cpp
    $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o

何が悪いかわかる人?

解決方法は?

コンパイラの指示通りに、すなわち -fPIC . このフラグが何をするのか、なぜこのような場合に必要なのかについては コード生成オプション GCCマニュアルの

簡単に言うと、この用語は 位置独立コード (PIC) とは、メモリアドレスに依存しない、つまり RAM に読み込まれた場所を仮定しない生成されたマシンコードのことを指します。共有オブジェクト(SO)には、RAM上の位置を動的に変更する能力が必要なため、位置に依存しないコードのみが含まれることになっています。

最後に、以下のページで紹介されています。 ウィキペディア もあります。