22

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オプションを追加してそれを行いましたが、それでも同じエラーが発生します。これを解決する方法はありますか?この問題は64ビットマシンの使用に関連していることを確認しましたが、実際に使用しています。CFLAGSCXXFLAGS

4

7 に答える 7

12

私はかなり前にこの問題を抱えていましたが、私の記憶が正しければ、修正はコマンドラインで gcc の直後に -fPIC の配置を移動していました。まったく意味がありませんでしたが、今ではそれほど意味がありませんが、私が覚えているように、それで修正されました.

于 2008-12-03T03:22:55.913 に答える
5

同じ問題が発生しましたが、さらにひねりがありました。@clintmの回答で解決しましたが、今後の参考のために、ここで問題のバリエーションを説明すると思いました...

32 ビット マシンの Makefile:

CXX=g++
CXXFLAGS= -O3 -Wall
...
...   
%.o:  %.c
    $(CXX)  $(CXXFLAGS)  -fpic  -c  $<      

libmylibrary.so: $(OBJECTS)
    $(CXX) -shared -Wl,-soname,$@ -o $@   $(OBJECTS)

これは正しくコンパイルされました。しかし、同じ Makefile を 64 ビット マシンで試したところ失敗しました。「-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)

そしてそれは働いた!

于 2013-01-21T15:18:33.523 に答える
0

android-ndk ツールチェーンとのクロスコンパイルでこの問題に遭遇しました。私は結局使用しなければならなかった

CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"

この状況では、どちら-fPIC-fPIE私のために働いていませんでした。

于 2015-10-12T01:53:48.153 に答える
0

次のようなメイクファイルがあるとします。

CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...

TARGET = libmyawesomelib.a

all: $(TARGET) main

次のように -fPIC フラグを追加するだけです。

$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
        .
        .
        .

メイクファイルの残りの部分についても同様です。

于 2014-10-03T01:30:52.880 に答える