Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 重新定位R_X86_64_32S与`.rodata';制作共享对象时不能使用;用-fPIC重新编译_Linux_Eclipse_Makefile_Java Native Interface - Fatal编程技术网

Linux 重新定位R_X86_64_32S与`.rodata';制作共享对象时不能使用;用-fPIC重新编译

Linux 重新定位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

我试图在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/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