Подтвердить что ты не робот

Перекомпилируйте с опцией -fPIC, но опция уже находится в make файле

Я получаю эту ошибку, когда делаю 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-разрядной машины, и это правда, что я использую ее.

4b9b3361

Ответ 1

У меня была эта проблема некоторое время назад, и если я правильно помню, исправление перемещало размещение -fPIC сразу после gcc в командной строке. Не имело никакого смысла и, тем более, сейчас, но, насколько я помню, это исправило это.

Ответ 2

Я столкнулся с той же проблемой, но у нее был дополнительный поворот. Ответ от @clintm решил, но я подумал, что описал бы мою вариацию проблемы здесь для будущей справки...

Makefile на 32-битной машине:

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

libmylibrary.so: $(OBJECTS)
    $(CXX) -shared -Wl,-soname,[email protected] -o [email protected]   $(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 [email protected]    $<   

libalglib.so: $(OBJECTS)
        $(CXX) -shared -Wl,-soname,[email protected]  -o [email protected]      $(OBJECTS)

И это сработало!

Ответ 3

если проект, который вы хотите скомпилировать, имеет правильную конфигурацию script, например:

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

поэтому флаг будет всем правилом Makefile...

за несколько дней до того, как мне понадобится старая версия. VLC для компиляции на компьютере x64, он имеет приятную конфигурацию script; -)

Ответ 4

Скажем, у вас есть makefile, например:

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

TARGET = libmyawesomelib.a

all: $(TARGET) main

просто добавьте флаг -fPIC следующим образом:

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

и так далее с остальной частью make файла.

Ответ 5

Я столкнулся с этой проблемой кросс-компиляции с помощью инструментальной привязки android-ndk. Мне пришлось использовать

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

В этой ситуации для меня не работало ни -fPIC, ни -fPIE.

Ответ 6

Я перекрестно компилировал shadowsocks-libev на машине CentOS 7, эта же проблема возникла со мной, она отлично работает на моем ноутбуке с

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 это не сработало, мне нужно добавить -fPIC в CC и CXX, чтобы заставить его работать

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