c++ - 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
有人知道我在做什么错吗?
解决方案
错误“不是有效的 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 上通常支持相同的功能。
推荐阅读
- nginx - 允许在 kubernetes 中与 nginx 进行集群内通信
- testing - 如何在松露中测试应付方法?
- visual-studio-2017 - 最近对我的 SharePoint 2013 服务器上的 Visual Studio 2017 的更新破坏了加载项调试
- solr - 如何在 SolrCloud 上强制一个领导者?
- python - 熊猫按天分类
- java - 同时选择两个或多个形状
- ios - frame.size 不适合 iphone 模拟器 spritekit swift
- java - 分别用线程 T1 和 T2 打印奇偶数,如果素数来了,则以相反的顺序打印
- javascript - Mongoose:尝试使用 $pullAll 删除引用的对象
- arrays - Swift:从数组中删除特定对象的更好方法?