gpt4 book ai didi

python - 在 Python 中编译 C DLL 并与之交互可以在 Unix 上运行,但不能在 Windows 上运行。这样做的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 14:42:15 25 4
gpt4 key购买 nike

所以,我有以下文件:

addone.c

long int addone(long int x){
return x+1;
}

然后通过 Windows 安装的 GCC 7.2.0 编译成 DLL(我也尝试过使用 Intel C++ 编译器,将函数更改为 extern "C"long int addone(long int x ),但是当我尝试将其加载到 Python 中时,这不会改变结果):

gcc -c addone.c
gcc -shared -o addone.dll addone.o

然后我尝试将其加载到 python 3.6.7 中:

import ctypes
_addone = ctypes.CDLL("addone.dll")

虽然我确实设法获取了 CDLL 对象,但它缺少函数“addone”。我尝试过使用 ctypes.WinDLL()ctypes.windll.LoadLibrary 方法导入 C DLL,但这些方法都实现了相同的最终结果:我得到一个对象来自不拥有公共(public)方法的 ctypes,并且没有一个私有(private)方法(在 Python 对象中,而不是 DLL 中)似乎与 addone 函数相关。

为了再次检查我的编译器是否按照我的预期运行,我反汇编了生成的 DLL,它看起来像一个典型的 DLL。在内部,该函数甚至没有名称损坏:

0000000530ce1030 <add_one>:
530ce1030: 55 push %rbp
530ce1031: 48 89 e5 mov %rsp,%rbp
530ce1034: 48 89 4d 10 mov %rcx,0x10(%rbp)
530ce1038: 48 8b 45 10 mov 0x10(%rbp),%rax
530ce103c: 48 83 c0 01 add $0x1,%rax
530ce1040: 5d pop %rbp
530ce1041: c3 retq
530ce1042: 90 nop
<Everything between these two instructions is just more no-ops>
530ce104f: 90 nop

我已经能够在 Unix 系统上完成这项工作,并且在该平台上将 C DLL 与 Python 连接起来没有任何问题。然而,转向 Windows 后,我觉得我错过了一些东西。即使在不同的机器上尝试所有这些,我仍然无法访问我编写的函数。

我觉得我错过了一些东西。我做错了什么?

最佳答案

尝试导出函数:

#include "addone.h"

EXPORT long int addone(long int x){
return x+1;
}

并制作头文件addone.h:

#define EXPORT __declspec(dllexport)

EXPORT long int addone(long int x);

关于python - 在 Python 中编译 C DLL 并与之交互可以在 Unix 上运行,但不能在 Windows 上运行。这样做的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com