2012-05-02 84 views
11

這工作正常的Windows 7使用Python 2.7時:WindowsError:[錯誤126]加載與ctypes的一個DLL

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 

我試圖複製DLL到Windows \ System32下,也與進入全路徑名

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

並沒有「.DLL」擴展名。什麼都沒有

回答

20

錯誤126是當你找不到依賴的DLL時得到的。有兩個明顯的原因:

  1. 您的DLL未找到。
  2. 您的DLL依賴於其他無法找到的DLL。

我懷疑選項1是問題,但無論如何我想我可能會使用該DLL的完整路徑來確保。

因此,留下選項2,最常見的原因是您的目標計算機沒有安裝C++運行時。無論是在目標機器上安裝C++運行時,還是在構建DLL時使用靜態鏈接/MT,以便不需要重新分配運行時。

可能在您開發DLL的機器上,您已經安裝了一個C++編譯器併爲您安裝了運行時。在代碼失敗的目標機器上,您尚未安裝編譯器,因此運行時不存在。

+0

謝謝大衛。聽起來非常有道理,因爲我在Windows 7機器上編譯了Visual Studio 2010 Express,而該機器不在目標機器上。我按照建議在目標機器上安裝了C++運行時並重新啓動。同樣的錯誤不幸。 – MortCanty

+0

您可以在配置文件模式下使用Dependency Walker來檢查它。但我會考慮用'/ MT'重建DLL,只是爲了仔細檢查它是不是導致問題的依賴。 –

+0

對,剛剛用/ MT重建,它現在在目標上運行。非常感謝! – MortCanty

0

您使用哪種編譯器構建庫?也許一些必需的庫丟失?您可以使用Dependency Walker(http://www.dependencywalker.com/)查看該庫與哪些依賴關係?