首页 > 解决方案 > C++:dll 不适用于 Visual Studio 2017,但适用于 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

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

标签: c++visual-studiodllvisual-studio-2017g++

解决方案


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

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

Win32 API(也称为 Windows API)是 Windows 应用程序的本机平台。此 API 最适合需要直接访问系统功能和硬件的桌面应用程序。Windows API 可以在所有桌面应用程序中使用,并且在 32 位和 64 位 Windows 上通常支持相同的功能。


推荐阅读