不满意链接错误:找不到指定的过程

2022-09-04 19:46:58

我正在编写一些JNI代码,C++从Windows XP上的小程序调用。我已经能够成功运行小程序并加载和调用JNI库,甚至让它调用其他DLL中的函数。我通过设置PATH系统环境变量来包含我所有DLL所在的目录,从而实现了这一点。

所以,问题是,我添加了另一个使用新的外部DLL的调用,突然在加载库时,会抛出一个不满意的LinkError。消息为:“找不到指定的过程”。这似乎不是缺少依赖 DLL 的问题,因为我可以删除依赖 DLL 并获取有关缺少依赖 DLL 的不同消息。从我能够在网上找到的内容来看,此消息似乎意味着DLL中缺少本机Java函数实现,但是奇怪的是,如果没有这些额外的代码,它就可以正常工作。

有谁知道可能导致这种情况的原因吗?什么样的东西可以为不满意的LinkError提供“找不到指定的过程”消息?


答案 1

我弄清楚了问题所在。这是一个打瞌睡。不满意的LinkError的消息“找不到指定的过程”指示找不到根 dll 或从属 dll 中的函数。在 JNI 情况下,最可能的原因是本机 JNI 函数未正确导出。但是,如果加载了从属 DLL 并且该 DLL 缺少其父级所需的函数,则显然会发生这种情况。

例如,我们有一个名为 input.dll 的库。DLL 搜索顺序是始终首先查找应用程序目录,最后查找 PATH 目录。过去,我们总是从与输入.dll相同的目录中运行可执行文件。但是,还有另一个输入.dll windows 系统目录(位于 DLL 搜索顺序的中间)中。因此,当我从java小程序运行它时,如果我在小程序中包含上述代码,这会导致输入.dll被加载,它会从系统目录中加载输入.dll。由于我们的代码期望输入中的某些函数.dll这些函数不存在(因为它是不同的 DLL),因此加载将失败,并显示有关缺少过程的错误消息。不是因为 JNI 函数导出错误,而是因为加载了错误的依赖 DLL,并且它没有预期的函数。


答案 2

DLL 可能是使用 C++(而不是 C)构建的。除非你注意在手术上做一个extern,这是一个可能的原因。

尝试从 DLL 导出所有函数。如果列表中包含您的函数,那么您就很好。


推荐