Linux 重新定位R_X86_64_32S与`.rodata';制作共享对象时不能使用;用-fPIC重新编译
我试图在Ubuntu 14.04上的Eclipse中为JNI运行以下makefileLinux 重新定位R_X86_64_32S与`.rodata';制作共享对象时不能使用;用-fPIC重新编译,linux,eclipse,makefile,java-native-interface,Linux,Eclipse,Makefile,Java Native Interface,我试图在Ubuntu 14.04上的Eclipse中为JNI运行以下makefile CLASS_PATH = ../bin vpath %.class $(CLASS_PATH) all : libSend.so libSend.so : Send.o gcc -fPIC -shared -o $@ $< Send.o : Send.c Send.h gcc -fPIC -I"/usr/lib/jvm/java-8-openjdk-amd64/in
CLASS_PATH = ../bin
vpath %.class $(CLASS_PATH)
all : libSend.so
libSend.so : Send.o
gcc -fPIC -shared -o $@ $<
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 $@
Send.h : Send.class
javah -classpath $(CLASS_PATH) $*
clean :
rm Send.h Send.o libSend.so
请帮助我解决此问题。当我遵循@AndrewHenle的建议时,我的代码工作正常:
make clean; make all
谢谢@AndrewHenle.为什么make不尝试构建
Send.o
?javah
是否正在当前目录中实际创建Send.h
?什么是make-d
输出?您是否尝试make clean;make all
?@EtanReisner为什么make不尝试构建Send.o
?因为它已经存在,除非Send.c
或Send.h
更改,否则不会重新编译,因为这些是它在makefile中列出的唯一依赖项。@AndrewHenle和重建Send.h
的javah
命令正在运行。大概它应该创建头文件并更新其时间戳。这就是为什么我在上一篇评论中问“是否在当前目录中实际创建了Send.h
?”make clean
对于正确编写的生成文件来说应该永远都不是必需的。@EtanReisner Send.h是在当前目录中创建的。这不是答案。这是一个解决办法。正如我在评论中所说的,对于一个正确的makefile,这应该是不必要的。下次Send.h
需要更改时,您将再次陷入这种情况。我相信。我运行过一次make clean。之后,我多次运行我的应用程序,没有出现任何问题。但它是否每次都重建Send.o
?我打赌没有。您没有再次看到-fPIC
错误,因为现有的Send.o
这次是正确的。如果您有意错误地生成Send.o
(或用文本文件等替换),则可能会再次遇到问题。我修改了代码并尝试全部生成。Send.so重新生成,没有任何错误。Send.so每次都在重建。我检查了时间戳。如果我再次出现错误,您能指导我如何继续吗?请注意,我没有说任何关于Send.so
。我说的是Send.o
。答案是你需要弄清楚为什么javah
没有让make看到Send.h
是新的,因此需要重建Send.o
。您在帖子中的输出表明javah
已运行,但Send.o
未得到重建,这就是问题所在。为什么javah
没有导致Send.h
具有新的时间戳,从而导致Send.o
需要重建。类文件更改了吗?(也许javah
足够聪明,如果不需要的话,就不会替换它的输出。)
make clean; make all