2008-12-02 5 views
18

ich diesen Fehler, wenn ich das Make tun:Recompile mit -fPIC Option, aber die Option ist bereits in der Make-Datei

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

Er sagt, dass ich mit der -fPIC Option neu kompilieren sollte. Ich habe das getan, die -fPIC Option zu CFLAGS und CXXFLAGS, aber ich bekomme immer noch den gleichen Fehler. Gibt es eine Möglichkeit, dies zu lösen? Ich habe gesehen, dass dieses Problem mit der Verwendung einer 64-Bit-Maschine zusammenhängt, und es ist wahr, dass ich eine verwende.

+0

Ist das ein Fehler vom Linker oder vom Compiler? Haben Sie vor dem erneuten Kompilieren alle Objektdateien bereinigt? – philant

+1

Ja, es ist ein Fehler vom Compiler und ja ich reinige alle Objekte und ich bekomme immer noch den gleichen Fehler. Vielen Dank. – Eduardo

+0

In Verbindung stehende Frage http://stackoverflow.com/questions/1250608/passing-a-gcc-flag-through-makefile Sollte Ihre vor der Veröffentlichung von mir geprüft haben. –

Antwort

9

Ich hatte dieses Problem eine ganze Weile zurück und wenn ich mich richtig erinnere, wurde die Platzierung von -fPIC direkt nach gcc in der Befehlszeile verschoben. Hat absolut keinen Sinn gemacht, und weniger jetzt, aber wie ich mich erinnere, hat es das repariert.

+1

das hat auch für mich funktioniert. .. -fPIC direkt nach gcc in Makefile ie CC = gcc -Pthread -fPIC – ashishsony

+0

Ich stieß auf das gleiche Problem. Das Verschieben von "-fPIC" direkt nach dem "gcc" (wie du geschrieben hast) hat auch für mich funktioniert. Rätselhaft. – cmo

+0

Was waren die anderen Flaggen, die du mit 'gcc' benutzt hast? @ashishsony dein Beispiel zeigt '-fPIC' nicht direkt nach' gcc'. – icedwater

4

Ich stieß auf das gleiche Problem, aber es hatte eine zusätzliche Wendung. Die Antwort von @clintm gelöst, aber ich dachte, dass ich meine Variation des Problems hier für die Zukunft beschreiben würde ...

Makefile auf 32-Bit-Maschine:

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

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

Diese richtig zusammengestellt. Aber das gleiche Makefile ist fehlgeschlagen, als ich es auf einem 64-Bit-Rechner ausprobiert habe. Ich habe "-fpic" in "-fPIC" geändert und es ist immer noch fehlgeschlagen. Ich änderte die Objektregel in:

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

und es immer noch fehlgeschlagen.

Schließlich legte ich „-fPIC“ in dem eigentlichen Compiler Variablen (so dass jetzt „-fPIC“ erscheint in der Regel für jedes Objekt und die Regel für die gemeinsam genutzte Bibliothek):

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) 

Und es hat funktioniert!

0

, wenn das Projekt Sie möchten eine Anwendung korrekt configure so hat kompilieren:

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

so das Flag alles wird die Herrschaft des Makefile ...

wenige Tage vor i‘ Ich brauche einen älteren ver. von VLC auf einer x64-Maschine zu kompilieren, hat es ein schönes configure ;-)

0

Angenommen, Sie haben einige Make-Datei haben wie:

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

TARGET = libmyawesomelib.a 

all: $(TARGET) main 

nur die -fPIC Flagge hinzufügen wie folgt:

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

so weiter mit dem Rest des Makefile.

0

Ich stieß auf dieses Problem Cross-Compiling mit der android-ndk Toolchain. Ich landete mit

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

Weder -fPIC noch -fPIE für mich zu verwenden, arbeitete in dieser Situation.

Verwandte Themen