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.

19
demandé sur senderle 2008-12-02 04:31:39

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.

10
répondu clintm 2008-12-03 03:22:55

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é!

4
répondu cmo 2013-01-21 15:18:33

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 ...

0
répondu SoS 2013-04-18 12:31:22

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)
        .
        .
        .
0
répondu mmienko 2014-10-03 01:30:52

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

0
répondu jan 2015-10-12 01:53:48

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 
0
répondu Shuman 2017-02-17 08:39:35

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.

0
répondu b.pell 2018-06-21 18:44:34