1

私は Visual Studio 2010 をインストールしており、他の人から入手したプロジェクトを持っていますが、エラーなしで正常にビルドできます。JNAを使用してアクセスしたいWrapper.dllを取得します。Win7 64ビットを使用しています。

しかし、次のエラーが表示されます: java.lang.UnsatisfiedLinkError: ライブラリ 'Wrapper' をロードできません: 指定されたモジュールが見つかりませんでした。

もちろん、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 で構築された他の 3 つの dll に依存していることを発見しました。これらには上記の DLL が必要であり (dependencywalker でチェック)、Wrapper.dll もそれらをリンクしていると思います。

では、これらの古い dll を取り除くために実際に何をすればよいのでしょうか? VS2010 で他の 3 つの DLL をビルドする必要がありますか、それともこれは常に発生する問題ですか。つまり、古い DLL に依存するプリコンパイル済みライブラリを使用するには、古い DLL をコピーして貼り付ける必要があります。

これらの DLL をコピーして貼り付けずに、他のシステムでもプログラムを実行する方法はありますか?

4

1 に答える 1

2

必要なすべての DLL が、システムでロードできるようになっている必要があります。jna.library.path を定義すると、JNA が最初にロードされた DLL と依存 DLL を探す場所になります。さらに、java.library.path (基本的には PATH) で依存 DLL が検索されます。

MSVS は、多くの場合、その環境内でコードをビルド、デバッグ、および実行するときに、PATH に加えてパスを使用します。

ソリューション:

a) 本当に必要のない依存関係を削除します。これには、DLL を別の方法でビルドするように MSVS に指示することが含まれる場合があります

b) カスタム DLL の隣に非システム DLL を含めます (または PATH/java.library.path にそれらの場所を含めます)。

編集

a) 問題のある DLL を自分のディレクトリと同じディレクトリに含めることができます。これはターゲット システムへの影響はかなり少ないですが、いずれかのシステムに存在することが予想される DLL である場合は、そうする必要はありません。すべてのシステム DLL にアクセスできるように、java.library.path を調整することをお勧めします。

b) 依存する DLL を再コンパイルし、下位互換性と明示的なリンケージに注意することができます。ただし、DLL で使用される機能によっては、依存関係を削除できない場合があります。

MSVC[RP]80.DLL は、それぞれ C および C++ ランタイムです。以前のバージョンにリンクできる場合とできない場合があります。

IESHIMS.DLL は IE の一部であり、システム上にあるはずですが、プログラムからアクセスできないパスにある可能性があります。

GPSVC.DLL はグループ セキュリティ ポリシーと関係があるため、システムで使用できるようにする必要があります (DLL が導入されたときはいつでもモジュロ)。

于 2012-05-09T15:57:18.560 に答える