makefile recompile fpic

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