У меня есть (64-битная) DLL, написанная на C для вызова из CTypes в Windows. Он скомпилирован и связан с GCC в Cygwin, но когда я вызываю его из CTypes, я получаю «[WinError 126] Указанный модуль не может быть найден».
Путь к DLL правильный (я даже проверил его с помощью "if os.path.exists (path_to_dll)"). Исследования показывают, что эта ошибка чаще всего встречается, когда dll зависит от других dll, поэтому я скомпилировал ее с флагом -M в GCC, и он не сообщает о зависимостях.
Я вызвал библиотеки DLL, написанные на ассемблере, с использованием тех же строк ctypes, но эта библиотека C dll не загружается, даже если нет зависимостей.
Вот код C:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "WL_02.h"
double* main(double* X, int64_t len_X)
{
double *collect;
int64_t while_counter = 0;
int64_t collect_counter = 0;
int64_t new_len = 0;
int64_t this = 0;
int64_t start = 0;
int64_t stop = 0;
int64_t x = 0;
/* Initial memory allocation */
collect = (double *) malloc(len_X);
while (while_counter < len_X)
{
this = X[while_counter];
if (this < 10)
{
start = 0;
stop = this;
}
else
{
start = this - 10;
stop = this;
}
for (x = start; x < stop; x++)
{
if ((x % 2) != 0)
{
x *= x;
collect[collect_counter] = x;
collect_counter ++;
if (collect_counter >= len_X)
{
/* Reallocating memory */
new_len = len_X * 2;
collect = (double *) realloc(collect, new_len);
len_X = new_len;
}
}
}
while_counter += 1;
}
return (0);
}
Вот файл .h (WL_02.h):
#ifndef WL_02_H
#define WL_02_H
#define EXPORT_DLL __declspec(dllexport)
EXPORT_DLL double* main (double* X, int64_t len_X);
#endif
Вот строки компиляции и ссылки GCC:
gcc -c WL_02.c -o WL_02.obj
gcc -shared -o WL_02.dll WL_02.obj
Вот код CTypes:
hDLL = ctypes.WinDLL("C:/cygwin64/our_files/WL_02/WL_02.dll")
CallName = hDLL.main
CallName.argtypes = [ctypes.POINTER(ctypes.c_double),ctypes.c_int64]
CallName.restype = ctypes.POINTER(ctypes.c_int64)
ret_ptr = CallName(CA_X,length_array_out)
Ошибка возникает в первой строке (hDLL = ...), где я загружаю DLL.
Единственная внешняя зависимость, о которой я могу думать, - это msvcrt.dll, которая содержит malloc и realloc, но я считаю, что все, что мне нужно сделать, это включить stdlib.h, что я и сделал.
Заранее благодарю за любую помощь.
Я удалил C: и сделал его путем в стиле Cygwin, но Visual Studio по-прежнему возвращает то же сообщение об ошибке. Возможно, вы правы в том, что вам нужно использовать Python, установленный в Cygwin, но я не могу изменить Visual Studio для этого. Если кто знает другое решение с использованием Cygwin, буду очень признателен.
Вы можете установить Python из установки Cygwin. И эта версия не имеет / не должна иметь ничего общего с VStudio. Если вы запускаете его из Cygwin Python, используйте пути Cygwin, иначе используйте пути Выиграть. Обратите внимание, что ошибка не обязательно относится к этому .dll, она также может быть вызвана одной из его зависимостей (и я подозреваю, что в вашем случае это было cygwin1.dll).





Вы должны использовать пути стиля Cygwin (для .dll, например:
ctypes.WinDLL("/cygdrive/c/.......). Кроме того, вы пытаетесь загрузить его из Python, который устанавливается из Cygwin, а не из обычного ВыигратьPython, верно? msvcrt * .dll здесь не должен участвовать.