C : dll не работает в Visual Studio 2017, но работает с g

#c #visual-studio #dll #visual-studio-2017 #g

#c #visual-studio #dll #visual-studio-2017 #g

Вопрос:

У меня возникла эта проблема с более сложным кодом, это, естественно, упрощенный пример.

dll не работает с VS, но работает с g ,

У меня есть этот код,

 #include <stdio.h>      

extern "C" __declspec(dllexport) void func(int a)
{
    printf("a: %dn", a);
}
  

Это единственный файл в моем проекте VS. Я компилирую его, и VS успешно генерирует test.dll
Диспетчер конфигурации

Но когда я вызываю библиотеку (например, из python), она жалуется, что dll не является win32, см.,

 import os
import sys
import ctypes
import sys

file_dll = 'test.dll'
print('Using {}...'.format(file_dll),flush=True)
lib = ctypes.cdll.LoadLibrary(file_dll)
a=ctypes.c_int(0)
lib.func(a)
  

выводит,

     Using ./test.dll...
Traceback (most recent call last):
  File "call.py", line 14, in <module>
    lib = ctypes.cdll.LoadLibrary(file_dll)
  File "..anaconda3libctypes__init__.py", line 434, in LoadLibrary
    return self._dlltype(name)
  File "..anaconda3libctypes__init__.py", line 356, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
  

Теперь, если я скомпилирую тот же код, используя,

 g   test.cpp -shared -o test2.dll
  

выводит,

 Using test2.dll... a: 0
  

Кто-нибудь знает, что я делаю не так?

Комментарии:

1. Что произойдет, если вы создадите его в VS с конфигурацией «Release»? Возможно, Python не может (или не будет) загружать необходимые вспомогательные материалы для сборки отладки.

2. Хороший момент, но только что протестирован и точно такой же. Кроме того, я скомпилировал его с помощью символов отладки g -g , и он также отлично работает.

3. Я считаю, что VS требует dllmain функции в файле .cpp для компиляции. библиотека dll. Могут быть другие требования.

4. Вы имеете в виду в другом файле? Странно, что он компилируется без жалоб.

5. @myradio Рискуя спросить очевидное, процесс python тоже 32-разрядный?

Ответ №1:

Ошибка «недопустимое приложение Win32» часто указывает на несоответствие разрядности, когда 64-разрядный процесс пытается загрузить 32-разрядную библиотеку или наоборот. Учитывая, что опубликованный скриншот показывает, что DLL является 32-разрядной (платформа = x86), скорее всего, модуль python 64-разрядный.

Часть сообщения об ошибке «приложение Win32» не ссылается на то, что указанный модуль является 32-разрядным (что в данном случае действительно так). Скорее, «приложение Win32» — это технический термин для (native) Приложения Windows, независимо от разрядности хоста Windows или клиентского приложения. Цитирование MS из Win32 (Windows API):

Win32 API (также называемый Windows API) является собственной платформой для приложений Windows. Этот API лучше всего подходит для настольных приложений, которым требуется прямой доступ к системным функциям и оборудованию. Windows API можно использовать во всех настольных приложениях, и те же функции обычно поддерживаются в 32-разрядной и 64-разрядной версиях Windows.