1

我已经安装了 Visual Studio 2010 并且有一个我从其他人那里得到的项目,我可以成功地构建它而不会出现任何错误。我得到一个 Wrapper.dll,我想使用 JNA 访问它。我正在使用 Win7 64 位。

但我收到错误:java.lang.UnsatisfiedLinkError: Unable to load library 'Wrapper': The specified module could not be found。

Wrapper.dll 当然在正确的文件夹中,它是一个 32 位的 dll,我的 Java 程序也使用 32 位的 JRE,所以这不是错误的原因。

我使用 DependencyWalker 检查是否缺少 *.dll:

  • MSVCP80.DLL
  • MSVCR80.DLL
  • GPSVC.DLL
  • IESHIMS.DLL

是的,有一些缺失。我可以断定该错误与这些 DLL 丢失有关吗?但是为什么 Visual Studio 编译正确并且不抛出错误呢?如何解决这个问题以便访问 Wrapper.dll 中的这些函数?

我还读到下载 dll 可能不是正确的做法!(我知道 Wrapper.dll 依赖于另一个在 Visual Studio 2005 中构建的 dll 或源代码,如果感兴趣的话。)

编辑:

我发现 Wrapper.dll 依赖于其他三个可能是基于 MSVS2005 构建的 dll。这些需要上面提到的DLL(用dependencywalker检查),我猜因此Wrapper.dll也链接它们。

那么我该怎么做才能摆脱这些旧的 dll 呢?我是否需要使用 VS2010 构建其他三个 DLL,或者这是一个总是会出现的问题,这意味着您需要复制粘贴旧 DLL 才能使用依赖于这些的预编译库。

有没有办法让程序也可以在任何其他系统上运行而无需复制粘贴这些 DLL?

4

1 回答 1

2

所有必需的 DLL 必须可供系统加载。如果您定义 jna.library.path,JNA 将在其中查找最初加载的 DLL 以及任何相关的 DLL。此外,还将搜索 java.library.path(本质上是 PATH)以查找相关的 DLL。

在该环境中构建、调试和运行代码时,MSVS 经常使用除 PATH 之外的路径。

解决方案:

a) 移除你并不真正需要的依赖;这可能包括告诉 MSVS 以不同的方式构建您的 DLL

b) 在您的自定义 DLL 旁边包含非系统 DLL(或在 PATH/java.library.path 中包含它们的位置)

编辑

a)您可以在与您的目录相同的目录中包含有问题的 DLL。这对目标系统的影响相当小,但如果它们是预期会在任何系统上的 DLL,则不必这样做。最好调整 java.library.path 以便所有系统 DLL 都可以访问。

b) 您可以重新编译您的依赖 DLL,并更加注意向后兼容性和显式链接。但是,根据 DLL 使用的功能,您可能无法删除依赖项。

MSVC[RP]80.DLL 分别是 C 和 C++ 运行时;您可能会或可能无法链接到以前的版本。

IESHIMS.DLL 是 IE 的一部分,应该在系统上,但可能位于您的程序无法访问的路径中。

GPSVC.DLL 与组安全策略有关,因此它应该在系统上可用(每当引入 DLL 时取模)。

于 2012-05-09T15:57:18.560 回答