Вопрос по ctypes, windows, dll, python – WindowsError: [Ошибка 126] при загрузке DLL с ctypes

12

Это прекрасно работает на Windows 7 с Python 2.7:

<code>lib = ctypes.cdll.LoadLibrary('prov_means')
provmeans = lib.provmeans  
</code>

Библиотека prov_means.DLL находится в моем рабочем каталоге. Он экспортирует простую, автономную функцию C provmeans () без каких-либо зависимостей.

Когда я пытаюсь сделать то же самое на Windows XP и Python 2.7, я получаю

<code>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 
</code>

Я попытался скопировать DLL в Windows \ System32, а также ввести полный путь

<code>"d:\\python\\auxil\\src\\prov_means"
</code>

с и без & quot; .DLL & quot; расширение. Ничего не работает

Ваш Ответ

2   ответа
22

что вы получаете, когда не удается найти зависимую DLL. Для этого есть две очевидные причины:

Your DLL is not being located. Your DLL depends on other DLLs that cannot be found.

Я сомневаюсь, что вариант 1 является проблемой, но в любом случае я думаю, что я, вероятно, буду использовать полный путь к этой DLL, чтобы быть уверенным.

Таким образом, остается вариант 2, и наиболее распространенной причиной этого является то, что на вашей целевой машине не установлена среда выполнения C ++. Либо установите среду выполнения C ++ на целевой машине, либо используйте статическое связывание,/MT, при создании вашей DLL, чтобы вам не нужно было перераспределять среду выполнения.

Вероятно, на компьютере, на котором вы разработали DLL, вы установили компилятор C ++, который установил для вас среду выполнения. На вашей целевой машине, где код не работает, вы не установили компилятор, и поэтому среда выполнения отсутствует.

Правильно, просто перестроить с / MT, и теперь он работает на цель. Большое спасибо! MortCanty
Это было очень полезно для меня. Просто поиск в Google привел меня к этому посту, и я рад, что я так быстро нашел решение с вашей помощью.
Спасибо Дэвид. Это звучало очень правдоподобно, когда я компилировал на компьютере с Windows 7 с Visual Studio 2010 Express, которого нет на целевой машине. Я установил среду выполнения C ++ на целевой машине, как было предложено, и перезапустил. Та же ошибка, к сожалению. MortCanty
Вы можете использовать Dependency Walker в режиме профиля, чтобы проверить это. Но я хотел бы рассмотреть возможность восстановления библиотеки DLL с/MT просто дважды проверьте, что это не та зависимость, которая вызывает проблему.
Я думаю, это означает, что вы можете решить проблему, установив re-dist, но для простой DLL/MT это самый простой вариант. Это позволяет вашей DLL стоять отдельно.
0

некоторые необходимые библиотеки отсутствуют? Вы можете проверить, какие зависимости у библиотеки есть с Dependency Walker (http://www.dependencywalker.com/)?

Похожие вопросы