博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python调用c/c++写的dll
阅读量:6087 次
发布时间:2019-06-20

本文共 2666 字,大约阅读时间需要 8 分钟。

相当于翻译了这篇文章,,我的目的是为了备注一下我使用失败的情况。

首先,作者推荐了Cython可以作为一个更好的C的python封装,我没去用,直接用vs的工具来生成如下dll吧

1,编写源码

C程序//test.c__declspec(dllexport) int sum(int a, int b) {    return a + b;}C++//test.cpp#define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT int sum(int a, int b) {    return a + b;}
windows用户
__declspec(dllexport)是必需的,也能使程序不需要.def文件就能访问,其实我不懂啥意思,Linux用户可以忽略掉此前缀。
C++的前缀比C又多了截extern "C",是为了避免编译器添加额外的东西,所以如果是做一个C++的dll的话,也是必须的,其实你照抄前缀就可以了。
其实大多数示例都是直接写成
extern "C" __declspec(dllexport) int sum(int a, int b) 这样的,这只是可读性的问题。
还可以添加一个头文件,类似C#的接口,想省事就不要
//test.hint sum(int, int);

2,编译成DLL/SO

既然是教你们直接生成dll,那么当然不是建一个类库项目,直接用vs提供的命令行工具吧,导航到test.c/test.cpp目录,然后执行:
>cl /LD test.c
[...]
/out:test.dll
/dll
/implib:test.lib
test.obj
   Creating library test.lib and object test.exp
Note: cl use the file extension (.c or .cpp) to know if the source is written in C or C++.
Linux用户用gcc/g++生成一个.so文件:
gcc -Wall -Wextra -O -ansi -pedantic -shared test.c -o test.so
Note: the -shared option is responsible to create the .so.
Note: You can also use Dependency Walker or similar programs to see the list of the exported functions and check if the sum function is there.
以上未测试

3, 用ctypes模块访问dll/so

从python2.5起已经默认包含了ctypes,否则请自行安装(easyinstall或pip,或下载)

>>> from ctypes import cdll

>>> mydll = cdll.LoadLibrary('test.dll')
>>> mydll
<CDLL 'test.dll', handle 10000000 at b92310>
windows在当前目录自动搜索,Linux请传入路径:
>>> from ctypes import cdll
>>> mydll = cdll.LoadLibrary('/home/wolf/test.so')
>>> mydll
<CDLL '/home/wolf/test.so', handle 9ba7d30 at b7e55d2c>
测试:
>>> mydll.sum
<_FuncPtr object at 0x00AF6918>
>>> mydll.sum(5, 3)
>>> 8

==好了,以上是原文,我的问题如下:

1, 因为开发环境是x64,也就装了64位版的python,结果老是失败,装回32位版的,以上测试直接通过,绝对是64位的原因,哪怕这个dll是在我的64位机器上编译的。几台装了x64的python都没有调成功
2, 下面是这样的一个C方法,需要传入一个int数组和一个字符数组

int CCaptionApp(int times,int length, int *ids,char *message){    int n,m=0;    for(n=0;n
经实测,字符数组直接传string即可,int数组我也想如法炮制:
>>> from ctypes import cdll
>>> mydll = CDLL('test.dll') #顺便演示另一种加载方式,书写快一些
>>> mydll.CCaptionApp(1,3,[3,4,5],'hello')
输出:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: Don't know how to convert parameter 3
看样子这个巧是不能取的(BTW,.net直接用int[]调即可), ,其中的15.17.1.13 Array一节:
>>> from ctypes import *
>>> TenIntegers = c_int * 10
>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print ii
<c_long_Array_10 object at 0x...>
>>> for i in ii: print i,
...
1 2 3 4 5 6 7 8 9 10
>>>
那就是要我们用长度构造一个数组,OK,测试:
>>> from ctypes import *
>>> mydll = CDLL('test.dll')
>>> mydll.CCaptionApp(1,3,(c_Int*3)(3,4,5),'hello')
>>> 12
成功

转载于:https://www.cnblogs.com/walkerwang/archive/2013/04/07/3006009.html

你可能感兴趣的文章
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VS2008查看dll导出函数
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>
atitit.细节决定成败的适合情形与缺点
查看>>
Mysql利用binlog恢复数据
查看>>
我的友情链接
查看>>
用yum安装mariadb
查看>>
一点IT"边缘化"的人的思考
查看>>
WPF 降低.net framework到4.0
查看>>
搭建一个通用的脚手架
查看>>
开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
查看>>
开源磁盘加密软件VeraCrypt教程
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>
阿里云公共镜像、自定义镜像、共享镜像和镜像市场的区别 ...
查看>>