2016-04-27 3 views
1

Ich versuche, das folgende Makefile für JNI in Eclipse auf Ubuntu 14,04Verschiebung R_X86_64_32S gegen `.rodata 'kann nicht verwendet werden, wenn ein gemeinsames Objekt erstellt wird; neu kompiliert mit -fPIC

CLASS_PATH = ../bin 

vpath %.class $(CLASS_PATH) 

all : libSend.so 

libSend.so : Send.o 
     gcc -fPIC -shared -o [email protected] $< 

Send.o : Send.c Send.h 
     gcc -fPIC -I"/usr/lib/jvm/java-8-openjdk-amd64/include" -I"/usr/lib/jvm/java-8-openjdk-amd64/include/linux" -c $< -o [email protected] 

Send.h : Send.class 
     javah -classpath $(CLASS_PATH) $* 

clean : 
     rm Send.h Send.o libSend.so 

Wenn ich versuche zu bauen diese Make-Datei auszuführen. Ich erhalte den folgenden Fehler:

make all 
javah -classpath ../bin Send 
gcc -fPIC -shared -o libSend.so Send.o 
/usr/bin/ld: Send.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC 
Send.o: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status 
make: *** [libSend.so] Error 1 

Bitte helfen Sie mir, dieses Problem zu lösen.

+0

Warum versucht man nicht, 'Send.o' zu erstellen? Wird mit 'javah' 'Send.h' im aktuellen Verzeichnis erstellt? Was gibt 'make -d' aus? –

+0

Haben Sie versucht, 'sauber zu machen; alles machen? –

+0

@EtanReisner * Warum versucht man nicht, 'Send.o' zu erstellen? * Weil es schon da ist und nicht neu kompiliert wird, außer' Send.c' oder 'Send.h' zu ändern, da dies die einzigen Abhängigkeiten sind, die im Makefile. –

Antwort

-1

arbeitete Mein Code, wenn ich @ AndrewHenle Vorschlag gefolgt:

make clean; make all 

Danke @AndrewHenle.

+0

Dies ist keine Antwort. Dies ist eine Problemumgehung. Wie ich in meinem Kommentar gesagt habe, sollte dies bei einem korrekten Makefile niemals notwendig sein. Sie werden in dieser Situation wieder stecken bleiben, wenn "Send.h" das nächste Mal geändert werden muss, glaube ich. –

+0

Ich ran mach mal sauber. Danach habe ich meine Bewerbung mehrfach ohne Probleme durchgeführt. – user2782405

+0

Aber hat es 'Send.o' jedes Mal neu erstellt oder nicht? Ich wette, dass es nicht so war. Sie haben den '-fPIC'-Fehler nicht mehr angezeigt, weil das vorhandene' Send.o' diesmal korrekt ist. Wenn Sie absichtlich * Send.o' falsch erstellen (oder es durch eine Textdatei usw. ersetzen), wird das Problem wahrscheinlich erneut auftreten. –

Verwandte Themen