Makeを実行すると、このエラーが発生します。
relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet' can not be used
when making a shared object; recompile with -fPIC
-fPIC
オプションを使用して再コンパイルする必要があると表示されます。 -fPIC
オプションをCFLAGS
とCXXFLAGS
に追加して実行しましたが、それでも同じエラーが発生します。これを解決する方法はありますか?この問題は64ビットマシンの使用に関連していることを確認しましたが、実際に使用しています。
私はかなり前にこの問題を抱えていました、そして私が正しく覚えていれば、修正はコマンドラインのgccの直後の-fPICの配置を移動していました。まったく意味がなく、今ではあまり意味がありませんが、私が覚えているように、それはそれを修正しました。
同じ問題が発生しましたが、さらにひねりがありました。 @clintmによる回答で解決しましたが、今後の参考のために、ここで問題のバリエーションについて説明すると思いました...
32ビットマシン上のMakefile:
CXX=g++
CXXFLAGS= -O3 -Wall
...
...
%.o: %.c
$(CXX) $(CXXFLAGS) -fpic -c $<
libmylibrary.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
これは正しくコンパイルされました。しかし、64ビットマシンで試したときに同じMakefileが失敗しました。 「-fpic」を「-fPIC」に変更しても失敗しました。オブジェクトルールを次のように変更しました。
%.o: %.c
$(CXX) -fPIC $(CXXFLAGS) -c $<
それでも失敗しました。
最後に、実際のコンパイラ変数に「-fPIC」を配置しました(これで、「-fPIC」が各オブジェクトのルールに表示されますおよび共有ライブラリのルール):
CXX=g++ -fPIC
CXXFLAGS= -g -O3 -Wall
...
%.o: %.c
$(CXX) $(CXXFLAGS) -c -o $@ $<
libalglib.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
そしてそれはうまくいきました!
Android-ndkツールチェーンとのクロスコンパイルでこの問題が発生しました。私は使用しなければならなくなった
CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"
どちらでもない-fPIC
または-fPIE
この状況で私のために働いた。
Gccをアップグレードした後、この問題が発生しました。 Makefileによってクリーンアップされていない.oファイル(sqlite)が1つあり、その結果、この問題が発生しました(古いバージョンのgccでコンパイルされていると想定)。そのファイルを削除して再構築した後、このエラーはなくなりました。
コンパイルするプロジェクトに正しい構成スクリプトがある場合は、次のように使用します。
$ ./configure 'CFLAGS=-g -O2 -fPIC ....' --enable-some-thing
したがって、フラグはすべてのMakefileのルールになります...
長老ver。が必要になる数日前。 x64マシンでコンパイルするVLCの場合、Niceconfigureスクリプトがあります;-)
私はCentOS7マシンでshadowsocks-libevをクロスコンパイルしていましたが、同じ問題が発生しました。ラップトップで完全に機能します。
CC=mipsel-unknown-linux-uclibc-gcc CXX=mipsel-unknown-linux-uclibc-g++ AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib make SHARED=1 CFLAGS=-fPIC
しかし、travis ciでは機能しませんでした。機能させるには、CCとCXXに-fPICを追加する必要があります。
CC="mipsel-unknown-linux-uclibc-gcc -fPIC" CXX="mipsel-unknown-linux-uclibc-g++ -fPIC" AR=mipsel-unknown-linux-uclibc-ar RANLIB=mipsel-unknown-linux-uclibc-ranlib make SHARED=1
次のようなメイクファイルがあるとします。
CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...
TARGET = libmyawesomelib.a
all: $(TARGET) main
次のように-fPICフラグを追加するだけです。
$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
.
.
.
残りのmakefileについても同様です。