2008-12-02 7 views
18

я получаю эту ошибку, когда я делаю макияж:Перекомпилируйте с -fpic вариант, но вариант уже в Makefile

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

+0

Это ошибка от компоновщика или компилятора? Удаляли ли вы все объектные файлы перед повторной компиляцией? – philant 2008-12-02 06:38:21

+1

Да, это ошибка компилятора и да, я очищаю все объекты, и я все равно получаю ту же ошибку. Спасибо. – Eduardo 2008-12-02 16:36:01

ответ

9

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

4

Я столкнулся с той же проблемой, но у нее был дополнительный поворот. Ответ на @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) 

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

0

, если проект, который вы хотели бы, чтобы скомпилировать имеет правильное использование настроить скрипт так:

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

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

за несколько дней до Я» нужна старая версия. из VLC для компиляции на x64 машине, он имеет приятный конфигурационный скрипт ;-)

0

Допустим, у вас есть некоторые Makefile, как:

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

TARGET = libmyawesomelib.a 

all: $(TARGET) main 

просто добавить -fPIC флаг так:

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

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

0

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

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

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