Makefile:找不到';menuEditor.GuiRenderJNI'';

Makefile:找不到';menuEditor.GuiRenderJNI'';,makefile,java-native-interface,Makefile,Java Native Interface,我在一个名为menuEditor的文件夹中有一个名为GuiRenderGUI的类文件。我已经检查了拼写,并且所有文件都存在,但是我仍然无法生成.h文件 我已经尝试过我的类路径的所有排列方式是../bin或../bin/menuEditor,而类是GuiRenderJNI或.menuEditor.GuiRenderJNI,下面的代码是一个带有“找不到…”错误的代码,所有其他排列方式只是说“没有规则使目标为`GuiRenderJNI.class' # Define a variable for cl

我在一个名为menuEditor的文件夹中有一个名为GuiRenderGUI的类文件。我已经检查了拼写,并且所有文件都存在,但是我仍然无法生成.h文件

我已经尝试过我的类路径的所有排列方式是../bin或../bin/menuEditor,而类是GuiRenderJNI或.menuEditor.GuiRenderJNI,下面的代码是一个带有“找不到…”错误的代码,所有其他排列方式只是说“没有规则使目标为`GuiRenderJNI.class'

# Define a variable for classpath
CLASS_PATH = ../bin/menuEditor

# Define a virtual path for .class in the CLASS_PATH directory
vpath %.class $(CLASS_PATH)

# $* matches the target filename without the extension
GuiRenderJNI.h : GuiRenderJNI.class
    javah -classpath $(CLASS_PATH) menuEditor.$*

clean :
    rm GuiRenderJNI.h GuiRenderJNI.o guirender.dll
我做错了什么?我在代码中找不到问题


编辑:

  • 我已经设法让javah生成一个头文件,方法是让它在.jar文件中查找类,使用完全相同的参数,如果有帮助的话,保存指向.jar的-classpath

因此我认为这里的问题是
vpath
如何解释其参数和
javah
如何解释(在查找
.class
文件时,而不是在查找
.jar
文件时)之间的区别

当您说
vpath%.class$(class\u路径)
时,您是在告诉make对于任何与模式
%匹配的先决条件,class
应该在
$(class\u路径)
下查找它们(通过它开始时的文件名)

当您说
-classpath$(CLASS\u PATH)
时,您告诉java使用
$(CLASS\u PATH)
作为查找
.CLASS
.jar
文件的根路径。但是,它使用根路径的方式因您要查找的文件类型而异

查找jar文件时,java使用根路径并查找以包/模块/任何名称命名的文件。所以
javah-classpath/foo menuEditor.GuiRenderJNI
将查找
/foo/menuEditor.GuiRenderJNI.jar
(我相信,我不是一个java人)。(因此,我假设当它工作时,您已经创建了一个
menuEditor.GuiRenderJNI.jar
文件,或者类似的文件。)

查找类文件时,java使用根路径作为目录层次结构的起点,目录层次结构包含基于类名的组件。因此
javah-classpath/foo menuEditor.GuiRenderJNI
将查找
/foo/menuEditor/GuiRenderJNI.class

当您拥有
./bin/menuEditor
$(CLASS_PATH)
时,您告诉make在
./bin/menuEditor/GuiRenderJNI.CLASS
中查找它可以找到的
GuiRenderJNI.CLASS
时,将它们放在一起。(这就是为什么
$(CLASS\u PATH)
的其他值给了您“无规则生成目标”错误,因为它再也找不到该类文件了。)

但是,相同的类路径(与
javah
调用结合)告诉java查找
。/bin/menuEditor/menuEditor/GuiRenderJNI.class
,由于明显的原因,无法找到该类

如果
javah
允许您指定要操作的类,您可能可以使用
javah-classpath$(class\u PATH)$(basename$@)
(不带后缀的非兼容目标,也可以使用
$(@:.h=)

如果
javah
不允许您这样做,那么您需要为
javah
命令行(类似于
$(dir$(CLASS\u PATH))
修改
$(CLASS\u PATH)


您也可以尝试(我不知道
vpath
是这样工作的,但我相信它是这样的)将
menuEditor
$(CLASS\u PATH)
中拉出,并将其放入目标
GuiRenderJNI.h:menuEditor/GuiRenderJNI.CLASS
的预请求中,然后离开
$(CLASS\u PATH)
javah
行相同。

对于记录
$*
作为目标文件名而不带扩展名是GNU make兼容性功能,手册建议不要使用。一般来说,
$*
是一个隐式(模式)规则所匹配的
词干。如果你找到了一个满足的答案,你应该将其作为答案发布并接受。我还没有找到一个满足该问题的答案。我不必将.class文件打包成.jar文件来让它工作……这就是为什么我说
if
-classpath
是否接受这样的相对路径(我假设是的,因为您说过它可以与jar一起工作)。在
javah
行中使用
$(abspath$(CLASS_PATH))
会改变什么吗?
-classpath
接受相对路径,遗憾的是
$(abspath…
也不起作用,现在要在下面的答案中尝试您的一些建议,真不敢相信我没有意识到我要求它在.class文件中查找.class…您建议的最后一个解决方案非常有效,谢谢。