Ответ 1
У меня была эта проблема некоторое время назад, и если я правильно помню, исправление перемещало размещение -fPIC сразу после gcc в командной строке. Не имело никакого смысла и, тем более, сейчас, но, насколько я помню, это исправило это.
Я получаю эту ошибку, когда делаю 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-разрядной машины, и это правда, что я использую ее.
У меня была эта проблема некоторое время назад, и если я правильно помню, исправление перемещало размещение -fPIC сразу после gcc в командной строке. Не имело никакого смысла и, тем более, сейчас, но, насколько я помню, это исправило это.
Я столкнулся с той же проблемой, но у нее был дополнительный поворот. Ответ от @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)
И это сработало!
если проект, который вы хотите скомпилировать, имеет правильную конфигурацию script, например:
$ ./configure 'CFLAGS=-g -O2 -fPIC ....' --enable-some-thing
поэтому флаг будет всем правилом Makefile...
за несколько дней до того, как мне понадобится старая версия. VLC для компиляции на компьютере x64, он имеет приятную конфигурацию script; -)
Скажем, у вас есть makefile, например:
CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...
TARGET = libmyawesomelib.a
all: $(TARGET) main
просто добавьте флаг -fPIC следующим образом:
$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
.
.
.
и так далее с остальной частью make файла.
Я столкнулся с этой проблемой кросс-компиляции с помощью инструментальной привязки android-ndk. Мне пришлось использовать
CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"
В этой ситуации для меня не работало ни -fPIC
, ни -fPIE
.
Я перекрестно компилировал 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