Recompiler avec l'option-fPIC, mais l'option est déjà dans le makefile
j'ai cette erreur quand je fais le faire:
relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet' can not be used
when making a shared object; recompile with -fPIC
Il dit que je dois recompiler avec le -fPIC
option. Je l'ai fait, en ajoutant
-fPIC
option CFLAGS
et CXXFLAGS
, mais j'obtiens toujours la même erreur. Est-il possible de résoudre ce problème? J'ai vu que ce problème est lié à l'utilisation d'une machine 64 bits, et il est vrai que je suis en utilisant un.
7 réponses
j'ai eu ce problème il y a un certain temps et si je me souviens bien, le correctif déplaçait le placement de-fPIC juste après gcc dans la ligne de commande. Fait absolument aucun sens, et encore moins maintenant, mais comme je m'en souviens, qu'il fixe.
j'ai rencontré le même problème, mais il avait un supplément de torsion. La réponse de @clintm l'a résolu, mais j'ai pensé que je pourrais décrire ma variation du problème ici pour référence future...
Makefile sur une machine 32 bits:
CXX=g++
CXXFLAGS= -O3 -Wall
...
...
%.o: %.c
$(CXX) $(CXXFLAGS) -fpic -c $<
libmylibrary.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
cette compilation est correcte. Mais le même Makefile a échoué quand je l'ai essayé sur une machine 64 bits. J'ai changé "-fpic" en "-fPIC" et ça a échoué. J'ai changé l'objet de la règle:
%.o: %.c
$(CXX) -fPIC $(CXXFLAGS) -c $<
et encore échouer.
finalement, j'ai placé "- fPIC" dans la variable du compilateur actuel (de sorte que maintenant "-fPIC" apparaît dans la règle pour chaque objet et la règle de la bibliothèque partagée):
CXX=g++ -fPIC
CXXFLAGS= -g -O3 -Wall
...
%.o: %.c
$(CXX) $(CXXFLAGS) -c -o $@ $<
libalglib.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
et ça a marché!
si le projet que vous souhaitez compiler a un script configure correct utilisez comme ceci:
$ ./configure 'CFLAGS=-g -O2 -fPIC ....' --enable-some-thing
ainsi le drapeau sera la règle du Makefile ...
disons que vous avez un makefile comme:
CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...
TARGET = libmyawesomelib.a
all: $(TARGET) main
il suffit d'ajouter le drapeau-fPIC comme suit:
$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
.
.
.
j'ai rencontré ce problème de compilation croisée avec la chaîne d'outils android-ndk. J'ai fini par avoir à utiliser
CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"
ni l'un ni l'autre -fPIC
ni
j'étais en train de compiler shadowsocks-libev sur une machine CentOS 7, le même problème m'est arrivé, ça marche parfaitement sur mon portable avec
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
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
j'ai eu ce problème après avoir amélioré gcc. J'en avais un .o fichier (sqlite) qui n'avait pas été nettoyé par le Makefile et en conséquence j'ai eu ce problème (en supposant qu'il ait été compilé avec une ancienne version de gcc). Après avoir supprimé ce fichier et reconstruit cette erreur a disparu.