Makefile:找不到';menuEditor.GuiRenderJNI'';
我在一个名为menuEditor的文件夹中有一个名为GuiRenderGUI的类文件。我已经检查了拼写,并且所有文件都存在,但是我仍然无法生成.h文件 我已经尝试过我的类路径的所有排列方式是../bin或../bin/menuEditor,而类是GuiRenderJNI或.menuEditor.GuiRenderJNI,下面的代码是一个带有“找不到…”错误的代码,所有其他排列方式只是说“没有规则使目标为`GuiRenderJNI.class'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
# 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…您建议的最后一个解决方案非常有效,谢谢。