Перекомпилируйте с опцией -fPIC, но эта опция уже находится в make-файле - PullRequest
21 голосов
/ 02 декабря 2008

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

Ответы [ 7 ]

10 голосов
/ 03 декабря 2008

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

4 голосов
/ 21 января 2013

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

Makefile на 32-битном компьютере:

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)

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

0 голосов
/ 21 июня 2018

У меня была эта проблема после того, как я обновил gcc. У меня был один файл .o (sqlite), который не был очищен Makefile, и в результате у меня возникла эта проблема (при условии, что он был скомпилирован с более старой версией gcc) После удаления этого файла и восстановления эта ошибка исчезла.

0 голосов
/ 17 февраля 2017

Я кросс-компилировал 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 
0 голосов
/ 12 октября 2015

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

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

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

0 голосов
/ 03 октября 2014

Допустим, у вас есть какой-то make-файл вроде:

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

TARGET = libmyawesomelib.a

all: $(TARGET) main

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

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

и так далее с остальным make-файлом.

0 голосов
/ 18 апреля 2013

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

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

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

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

...