2008-12-02 18 views
18

je reçois cette erreur quand je fais la marque:recompiler avec l'option -fPIC, mais l'option est déjà dans le makefile

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 recompiler avec l'option -fPIC. Je l'ai fait, en ajoutant l'option -fPIC à CFLAGS et CXXFLAGS, mais je reçois toujours la même erreur. Est-ce qu'il y a un moyen de résoudre ceci? J'ai vu que ce problème est lié à l'utilisation d'une machine 64 bits, et il est vrai que j'en utilise un.

+0

Est-ce une erreur de l'éditeur de liens ou du compilateur? Avez-vous nettoyé tous les fichiers objets avant de les recompiler? – philant

+1

Oui c'est une erreur du compilateur et oui je nettoie tous les objets et j'ai toujours la même erreur. Je vous remercie. – Eduardo

+0

Question connexe http://stackoverflow.com/questions/1250608/passing-a-gcc-flag-through-makefile Doit avoir vérifié le vôtre avant de poster le mien. –

Répondre

9

J'ai eu ce problème assez longtemps 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 moins maintenant, mais si je me souviens, cela l'a réparé.

+1

cela a fonctionné pour moi aussi. .. ajouter -fPIC directement après gcc dans Makefile c'est-à-dire CC = gcc -pthread -fPIC – ashishsony

+0

J'ai rencontré le même problème. déplacer "-fPIC" directement après le "gcc" (comme vous avez écrit) a travaillé pour moi aussi. Déroutant. – cmo

+0

Quels sont les autres indicateurs utilisés avec 'gcc'? @ashishsony votre exemple ne montre pas tout à fait '-fPIC' directement après' gcc'. – icedwater

4

J'ai rencontré le même problème, mais il y avait une torsion supplémentaire. La réponse par @clintm résolu, mais je pensais que je qualifierais ma variation du problème ici pour référence future ...

Makefile sur la machine 32 bits:

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

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

Cette compilé correctement. Mais le même Makefile a échoué quand je l'ai essayé sur une machine 64 bits. J'ai changé "-fpic" en "-fPIC" et il a échoué. J'ai changé la règle d'objet à:

%.o: %.c 
    $(CXX) -fPIC $(CXXFLAGS) -c $< 

et il échouait toujours.

Enfin, j'ai placé « -fPIC » dans la variable du compilateur réelle (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 [email protected] $< 

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

Et ça a marché!

0

si le projet que vous souhaitez compiler a une utilisation de script de configuration correcte comme ceci:

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

de sorte que le drapeau sera toutes les règles de l'Makefile ...

quelques jours avant i » J'ai besoin d'un aîné ver. de VLC pour compiler sur une machine x64, il a un script de configuration bien ;-)

0

Disons que vous avez des makefile comme:

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

TARGET = libmyawesomelib.a 

all: $(TARGET) main 

ajouter juste le drapeau -fPIC comme ceci:

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

ainsi de suite avec le reste du fichier makefile.

0

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 -fPIC ni -fPIE a fonctionné pour moi dans cette situation.