编译并用C DLL接口内的Python于Unix,而不是Windows。什么是这样做的正确方法?

问题描述 投票:0回答:2

所以,我有以下文件:

addone.c

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

这个数据然后通过Windows安装GCC 7.2.0的(我也尝试使用英特尔C ++编译器,切换到extern "C" long int addone(long int x)后的功能,但是当我试图将其加载到不改变结果编译成一个DLL蟒蛇):

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

然后我试图加载到蟒蛇3.6.7:

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

虽然我设法让CDLL对象,它缺少的功能“addone”。我一直在使用进口çdll的ctypes.WinDLL()ctypes.windll.LoadLibrary方法试过,但这些都完成相同的最终结果是:我从那个拥有任何公共方法ctypes的对象,并没有一个私有方法(在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,但是,我觉得我失去了一些东西。即使尝试这一切都在不同的机器上,我还是不能设法让访问我写的功能。

我觉得我失去了一些东西。我究竟做错了什么?

python c dll ctypes
2个回答
1
投票

尝试导出功能:

#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);

0
投票

一些摆弄之后,我想通了,发生了什么事情。

该功能确实已经正确地写入,编译成一个DLL正确,和ctypes.CDLL对象正确创建。

该ctypes.CDLL对象没有立即“看到”的功能名称,因此为什么它不是在方法列表。我所做的就是忽略了一个事实,该方法是不是在对象的命名空间,我带着信心,并呼吁_addone.addone(x)的飞跃。这使得对象实现该功能是在DLL中,并且将其添加到命名空间。

我怀疑有一些后端的ctypes内回事,这里调用一个函数使它检查名称是否实际在库中存在。也许这是为了防止从命名空间由各种其他功能,编译器将到DLL被混乱。

© www.soinside.com 2019 - 2024. All rights reserved.