【发布时间】:2021-02-25 20:47:45
【问题描述】:
我遇到了更复杂代码的问题,这自然是一个简化的例子。
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
有人知道我做错了什么吗?
【问题讨论】:
-
如果您在 VS 中使用“Release”配置构建它会发生什么?也许 Python 不能(或不会)为 Debug 构建加载所需的支持。
-
好点,但刚刚测试过并且完全一样。此外,我使用
g++ -g使用调试符号编译它,它也可以正常工作。 -
我相信 VS 需要 .cpp 文件中的
dllmain函数来编译 .dll 库。可能还有其他要求。 -
您的意思是在不同的文件中?奇怪的是它编译时没有报错。
-
@myradio 冒着明显的风险,python 进程也是 32 位的吗?
标签: c++ visual-studio dll visual-studio-2017 g++