web-dev-qa-db-ja.com

-fPICオプションを使用して再コンパイルしますが、オプションはすでにmakefileにあります

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

21
Eduardo

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

10
clintm

同じ問題が発生しましたが、さらにひねりがありました。 @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)

そしてそれはうまくいきました!

5
cmo

Android-ndkツールチェーンとのクロスコンパイルでこの問題が発生しました。私は使用しなければならなくなった

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

どちらでもない-fPICまたは-fPIEこの状況で私のために働いた。

0
jan

Gccをアップグレードした後、この問題が発生しました。 Makefileによってクリーンアップされていない.oファイル(sqlite)が1つあり、その結果、この問題が発生しました(古いバージョンのgccでコンパイルされていると想定)。そのファイルを削除して再構築した後、このエラーはなくなりました。

0
b.pell

コンパイルするプロジェクトに正しい構成スクリプトがある場合は、次のように使用します。

$ ./configure 'CFLAGS=-g -O2 -fPIC ....' --enable-some-thing

したがって、フラグはすべてのMakefileのルールになります...

長老ver。が必要になる数日前。 x64マシンでコンパイルするVLCの場合、Niceconfigureスクリプトがあります;-)

0
SoS

私は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 
0
Shuman

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

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

TARGET = libmyawesomelib.a

all: $(TARGET) main

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

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

残りのmakefileについても同様です。

0
mmienko