我试图使用Python中的
ctypes
库调用C++函数:
test.py
from ctypes import *
from random import randint
tester = cdll.LoadLibrary('./test.dll')
print(tester.test(randint(1, 100)))
test.cpp
#include <vector>
int cppTest(int num) {
std::vector<int> v;
v.push_back(num);
return v.back();
}
extern "C" __declspec(dllexport) int test(int num) {
return cppTest(num);
}
然后执行以下命令:
> g++ -o test.dll -shared -fPIC test.cpp
> python test.py
并且我收到以下错误:|| |我认为使用任何 C++ STL 库都会导致问题,所以我尝试使用
Traceback (most recent call last):
File "test.py", line 4, in <module>
tester = cdll.LoadLibrary('./test.dll')
File "D:\Programs\Python\Python38\lib\ctypes\__init__.py", line 451, in LoadLibrary
return self._dlltype(name)
File "D:\Programs\Python\Python38\lib\ctypes\__init__.py", line 373, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 1114] Dynamic-link library (DLL) initialization routine failed.
并且再次出现相同的错误。
new int
我的环境:
Windows 10 x64
- Python 3.8.5 x64(与Python 3.6同样的问题)
- TDM-GCC 9.2.0
- 有人能帮我解决这个问题吗?
编辑:
编译的
文件是64位的,通过运行检查VS 2017 上的以下命令:
dll
编辑 2:
E:\...\test>dumpbin /headers test.dll
Microsoft (R) COFF/PE Dumper Version 14.16.27044.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file test.dll
PE signature found
File Type: DLL
FILE HEADER VALUES
8664 machine (x64)
13 number of sections
612A415D time date stamp Sat Aug 28 21:59:57 2021
10B000 file pointer to symbol table
6FA9 number of symbols
F0 size of optional header
2026 characteristics
Executable
Line numbers stripped
Application can handle large (>2GB) addresses
DLL
当我尝试使用 MinGW 作为编译器时,这里再次出现错误: When I tried to use MinGW as the compiler, here again was an error:
E:\...\test>python test.py
Traceback (most recent call last):
File "test.py", line 4, in <module>
tester = cdll.LoadLibrary('./test.dll')
File "D:\Programs\Python\Python38\lib\ctypes\__init__.py", line 451, in LoadLibrary
return self._dlltype(name)
File "D:\Programs\Python\Python38\lib\ctypes\__init__.py", line 373, in __init__
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'E:\...\test\test.dll' (or one of its dependencies). Try using the full path with constructor syntax.
错误“OSError: [WinError 1114] 动态链接库 (DLL) 初始化例程失败”通常在尝试加载与 Python 解释器不兼容的 DLL(例如,32 位 DLL 与 64 位 Python)时发生,或者 DLL 依赖于无法找到的其他 DLL。
但是,已经检查了 DLL 的体系结构,它看起来是正确的。让我们专注于确保正确配置 MinGW 并找到所有依赖项:
1. 使用 MinGW 进行编译
- 下载并安装 MinGW-w64: 如果还没有,请从 https://www.mingw-w64.org/ 下载 MinGW-w64 的最新安装程序并安装。 确保选择与的 Python 安装(64 位)匹配的正确架构。
-
将 MinGW-w64 bin 文件夹添加到的 PATH:
将 MinGW-w64 bin 文件夹的路径(例如,
C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
)添加到的系统环境变量PATH
中。这将允许 Python 找到g++
编译器。 - 使用 MinGW-w64 编译 DLL: 打开命令提示符或 PowerShell 并使用以下命令编译的 C++ 代码:
g++ -c -fPIC test.cpp -o test.o
g++ -shared -o test.dll test.o -Wl,--add-stdcall-alias
2. 依赖项
-
依赖项行者:
使用 Dependency Walker (
http://www.dependencywalker.com/
) 等工具检查
test.dll
的任何依赖项。这将显示 DLL 依赖的任何其他 DLL,并且需要确保这些 DLL 可用并且位于系统可以找到它们的位置(例如,与test.dll
在同一目录中,或在的系统 PATH 中)。 - C++ 运行时: 的 DLL 可能依赖于 Microsoft C++ 运行时库。可能需要在用于运行 Python 脚本的同一环境中安装相应的运行时可再发行组件包。
3. 测试 Python 代码
将
test.dll
和任何必要的依赖项放在与的 Python 脚本相同的目录中,或位于系统 PATH 中的目录中,然后再次运行的 Python 脚本。
如果在遵循这些步骤后问题仍然存在,请提供有关遇到的特定错误消息的更多信息,包括来自 Dependency Walker 的任何输出,以便我进一步帮助解决问题。
标签:python,c++,ctypes From: 68965141