C++ C++;:dll不适用于Visual Studio 2017,但适用于g++;
我在处理更复杂的代码时遇到了这个问题,这自然是一个简化的示例 dll不适用于VS,但适用于g++ 我有这个密码C++ 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: %d\n", a); } 产出 Using ./test.dll... Traceback (most recent call last):
#include <stdio.h>
extern "C" __declspec(dllexport) void func(int a)
{
printf("a: %d\n", 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
Using test2.dll... a: 0
产出
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
Using test2.dll... a: 0
有人知道我做错了什么吗?错误“不是有效的Win32应用程序”通常表示位不匹配,其中64位进程尝试加载32位库,或者相反。如果发布的屏幕截图显示DLL为32位(platform=x86),那么python模块很可能为64位
错误消息的“Win32 application”部分并不表示引用的模块是32位的(在本例中确实是这样)。相反,“Win32应用程序”是(本机)Windows应用程序的技术术语,与Windows主机或客户端应用程序的位无关。引述以下资料:
Win32 API(也称为Windows API)是Windows应用程序的本机平台。此API最适合于需要直接访问系统功能和硬件的桌面应用程序。Windows API可用于所有桌面应用程序,32位和64位Windows通常支持相同的功能
如果您使用“Release”配置在VS中构建它会发生什么?也许Python无法(或不会)加载调试构建所需的支持内容。这一点很好,但刚刚经过测试,完全相同。此外,我用调试符号用
g++-g
编译了它,它也工作得很好。我相信VS需要.cpp文件中的dllmain
函数来编译.dll库。可能还有其他要求。你是说在不同的文件中?奇怪的是,它编译时没有抱怨。@myradio冒着问显而易见的问题的风险,python进程也是32位的吗?