CTypes «[WinError 126] Указанный модуль не найден»

У меня есть (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, что я и сделал.

Заранее благодарю за любую помощь.

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

CristiFati 26.03.2018 11:26

Я удалил C: и сделал его путем в стиле Cygwin, но Visual Studio по-прежнему возвращает то же сообщение об ошибке. Возможно, вы правы в том, что вам нужно использовать Python, установленный в Cygwin, но я не могу изменить Visual Studio для этого. Если кто знает другое решение с использованием Cygwin, буду очень признателен.

RTC222 26.03.2018 18:07

Вы можете установить Python из установки Cygwin. И эта версия не имеет / не должна иметь ничего общего с VStudio. Если вы запускаете его из Cygwin Python, используйте пути Cygwin, иначе используйте пути Выиграть. Обратите внимание, что ошибка не обязательно относится к этому .dll, она также может быть вызвана одной из его зависимостей (и я подозреваю, что в вашем случае это было cygwin1.dll).

CristiFati 26.03.2018 18:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
683
0

Другие вопросы по теме