【问题标题】:C++: dll not working on Visual Studio 2017 but works with g++C++:dll 不适用于 Visual Studio 2017,但适用于 g++
【发布时间】: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++


【解决方案1】:

错误“不是有效的 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 上通常支持相同的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 2012-03-09
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2018-04-08
    • 2017-04-27
    • 2018-03-16
    相关资源
    最近更新 更多