makefile - Vuelva a compilar con la opción-fPIC, pero la opción ya está en el archivo MAKE
recompile (6)
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 comando. No tenía absolutamente ningún sentido, y menos ahora, pero según recuerdo, eso lo solucionó.
Recibo este error cuando hago la marca:
relocation R_X86_64_32 against `vtable for Torch::MemoryDataSet'' can not be used
when making a shared object; recompile with -fPIC
Dice que debería recompilar con la opción -fPIC
. Lo hice, agregando la opción -fPIC
a CFLAGS
y CXXFLAGS
, pero sigo teniendo 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.
Encontré el mismo problema, pero tenía un giro extra. La respuesta de @clintm lo resolvió, pero pensé que describiría mi variación del problema aquí para futuras referencias ...
Makefile en una máquina de 32 bits:
CXX=g++
CXXFLAGS= -O3 -Wall
...
...
%.o: %.c
$(CXX) $(CXXFLAGS) -fpic -c $<
libmylibrary.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
Esto 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 de objeto a:
%.o: %.c
$(CXX) -fPIC $(CXXFLAGS) -c $<
y todavía falló
Finalmente, puse "-fPIC" en la variable del compilador real (de modo que ahora aparece "-fPIC" 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 $@ $<
libalglib.so: $(OBJECTS)
$(CXX) -shared -Wl,-soname,$@ -o $@ $(OBJECTS)
¡Y funcionó!
si el proyecto que desea compilar tiene un script de configuración correcto, use así:
$ ./configure ''CFLAGS=-g -O2 -fPIC ....'' --enable-some-thing
entonces la bandera será la regla de todos los Makefile ...
pocos días antes he necesitado una versión más antigua. de VLC para compilar en una máquina x64, tiene una buena secuencia de comandos de configuración ;-)
Digamos que tienes algún archivo MAKE como:
CFLAGS = -g -Wall
SOURCES = $(wildcard *.c)
OBJECTS = ...
TARGET = libmyawesomelib.a
all: $(TARGET) main
simplemente agregue la bandera -fPIC de la siguiente manera:
$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
.
.
.
y así sucesivamente con el resto del archivo MAKE.
Me encontré con este problema de compilación cruzada con la cadena de herramientas android-ndk. Terminé teniendo que usar
CC="$CROSS/bin/arm-linux-androideabi-gcc -pie --sysroot=$SYSROOT"
Ni -fPIC
ni -fPIE
funcionaron para mí en esta situación.
Estaba compilando shadowsocks-libev en una máquina CentOS 7, el mismo problema me pasó, funciona perfectamente en mi computadora portátil con
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
pero en travis ci, no funcionó, tengo que agregar -fPIC a CC y CXX para que funcione
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