2008-12-02 19 views
18

consigo este error cuando lo haga la marca:Recompile con la opción -fPIC, pero la opción ya está en el makefile

relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet' can not be used 
when making a shared object; recompile with -fPIC 

Se dice que debería volver a compilar con la opción -fPIC. Lo hice, agregando la opción -fPIC a CFLAGS y CXXFLAGS, pero sigo recibiendo el mismo error. ¿Hay alguna forma de resolver esto? He visto que este problema está relacionado con el uso de una máquina de 64 bits, y es cierto que estoy usando uno.

+0

¿Esto es un error del enlazador o el compilador? ¿Limpiaste todos los archivos de objetos antes de volver a compilar? – philant

+1

Sí, es un error del compilador y sí, limpio todos los objetos y todavía obtengo el mismo error. Gracias. – Eduardo

+0

Pregunta relacionada http://stackoverflow.com/questions/1250608/passing-a-gcc-flag-through-makefile Debería haber revisado el suyo antes de publicar el mío. –

Respuesta

9

Tuve este problema hace bastante tiempo y, si no recuerdo mal, el arreglo estaba moviendo la ubicación de -fPIC justo después de gcc en la línea de comandos. No tenía absolutamente ningún sentido, y menos ahora, pero según recuerdo, eso lo solucionó.

+1

esto también funcionó para mí. ... agregando -fPIC directamente después de gcc en Makefile, es decir, CC = gcc -pthread -fPIC – ashishsony

+0

Encontré el mismo problema. mover "-fPIC" directamente después del "gcc" (como escribiste) también funcionó para mí. Misterioso. – cmo

+0

¿Cuáles fueron las otras banderas que usaste con 'gcc'? @ashishsony su ejemplo no muestra '-fPIC' directamente después de' gcc' embargo. – icedwater

4

Me encontré con el mismo problema, pero tenía un toque extra. La respuesta por @clintm lo resolvió, pero yo pensaba que iba a describir mi variación del problema aquí para referencia futura ...

Makefile en la máquina de 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) 

Este compilado correctamente. Pero el mismo Makefile falló cuando lo probé en una máquina de 64 bits. Cambié "-fpic" a "-fPIC" y todavía falló. Cambié la regla del objeto a:

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

y todavía falló.

Finalmente, coloqué "-fPIC" en la variable compilador real (por lo que ahora "-fPIC" aparece en la regla para cada objeto y la regla para la biblioteca compartida):

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) 

¡Y funcionó!

0

si el proyecto desea recopilar tiene un uso script de configuración correcta de esta manera:

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

así que la bandera es todo el gobierno del Makefile ...

pocos días antes de que yo' Necesito una versión más antigua. de VLC para compilar en una máquina x64, tiene un buen guión de configuración ;-)

0

Digamos que usted tiene algún archivo MAKE como:

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

TARGET = libmyawesomelib.a 

all: $(TARGET) main 

sólo tiene que añadir el indicador -fPIC así:

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

y así sucesivamente con el resto del archivo MAKE.

0

Me encontré con este problema de compilación cruzada con la cadena de herramientas android-ndk. Acabé tener que utilizar

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

Ni -fPIC ni -fPIE trabajó para mí en esta situación.

Cuestiones relacionadas