C++:dll 不适用于 Visual Studio 2017,但适用于 g++

C++: dll not working on Visual Studio 2017 but works with g++

我在使用更复杂的代码时遇到了这个问题,这自然是一个简化的示例。

dll 不适用于 VS 但适用于 g++,

我有这个代码,

#include <stdio.h>      

extern "C" __declspec(dllexport) void func(int a)
{
    printf("a: %d\n", 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 "..\anaconda3\lib\ctypes\__init__.py", line 434, in LoadLibrary
    return self._dlltype(name)
  File "..\anaconda3\lib\ctypes\__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

有人知道我做错了什么吗?

错误“不是有效的 Win32 应用程序”通常表示位数不匹配,其中 64 位进程试图加载 32 位库,反之亦然。鉴于发布的屏幕截图显示 DLL 是 32 位(平台 = x86),python 模块可能是 64 位。

错误消息的“Win32 应用程序”部分确实 不是 引用的模块是 32 位的(在此确实如此)。相反,“Win32 应用程序”是(本机)Windows 应用程序的技术术语,与 Windows 主机或客户端应用程序的位数无关。引用 MS 来自 Win32 (Windows API):

The Win32 API (also called the Windows API) is the native platform for Windows apps. This API is best for desktop apps that require direct access to system features and hardware. The Windows API can be used in all desktop apps, and the same functions are generally supported on 32-bit and 64-bit Windows.