2012-05-02 15 views
11

のctypesでDLLを読み込む:WindowsError:[エラー126]これは、Python 2.7とWindows 7で正常に動作します

lib = ctypes.cdll.LoadLibrary('prov_means') 
provmeans = lib.provmeans 

ライブラリprov_means.DLLは私の作業ディレクトリにあります。これは、依存関係のない単純なスタンドアロンC関数であるprovmeans()をエクスポートします。

私は、Windows XPとPython 2.7で同じことをしようとすると、私は

Traceback (most recent call last): 
    File "D:\python\Auxil\src\auxil.py", line 130, in <module> 
    lib = ctypes.cdll.LoadLibrary('prov_means') 
    File "C:\Python27\lib\ctypes\__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "C:\Python27\lib\ctypes\__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 126] The specified module could not be found 

を取得し、私は、Windows \ System32ににDLLをコピーしようとしたともして

"d:\\python\\auxil\\src\\prov_means" 

フルパス名を入力しています「.DLL」拡張子を使用しないでください。何も動作しません。

答えて

20

エラー126は、従属DLLが見つからない場合のエラーです。これには2つの明らかな原因があります。

  1. DLLは見つかりません。
  2. DLLは、見つからない他のDLLによって異なります。

私はオプション1が問題だとは思っていませんが、いずれにしても、おそらくそのDLLへのフルパスを使用していると思います。

したがって、オプション2とその最も一般的な原因は、ターゲットマシンにC++ランタイムがインストールされていないということです。ターゲットマシンにC++ランタイムをインストールするか、スタティックリンク/MTを使用してランタイムを再配布する必要がないようにDLLをビルドします。

DLLを開発したマシンでは、C++コンパイラがインストールされており、ランタイムがインストールされている可能性があります。コードが失敗するターゲットマシンでは、コンパイラーがインストールされていないため、ランタイムは存在しません。

+0

Davidさんありがとうございます。ターゲットマシンにはないVisual Studio 2010 Expressを使用してWindows 7マシンでコンパイルすると、それは非常に納得のいくものでした。私は、C++ランタイムを推奨されたとおりにターゲットマシンにインストールして再起動しました。残念ながら同じエラー。 – MortCanty

+0

プロファイルモードでDependency Walkerを使用してこれを確認できます。しかし、問題を引き起こしている依存関係ではないことを二重チェックするために、 '/ MT'でDLLを再構築することを検討したいと思います。 –

+0

右、/ MTで再構築され、ターゲット上で実行されるようになりました。どうもありがとう! – MortCanty

0

ライブラリをビルドするのにどのコンパイラを使用しましたか?おそらくいくつか必要なライブラリがありませんか? Dependency Walker(http://www.dependencywalker.com/)でライブラリの依存関係を確認できますか?