首先,作者推荐了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.h

int 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

windows在当前目录自动搜索,Linux请传入路径:

>>> from ctypes import cdll

>>> mydll = cdll.LoadLibrary('/home/wolf/test.so')

>>> mydll

测试:

>>> 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

{

m+=ids[n];

}

return m;

}

经实测,字符数组直接传string即可,int数组我也想如法炮制:

>>> from ctypes import cdll

>>> mydll = CDLL('test.dll') #顺便演示另一种加载方式,书写快一些

>>> mydll.CCaptionApp(1,3,[3,4,5],'hello')

输出:

Traceback (most recent call last):

File "", line 1, in

ctypes.ArgumentError: argument 3: : 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

>>> 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

成功

python编写dll_python调用c/c++写的dll相关推荐

  1. python编写表白程序_python如何写出表白程序

    用python编表白程序的方法: 1.创建GUI窗口,实现代码的调用. 2.编写点击触发函数,实现表白程序. 具体代码如下: from tkinter import * from tkinter im ...

  2. python编写递归函数_Python递归函数如何写?正确的Python递归函数用法!

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 一.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x - x n,用函数fact(n)表示,可以看出: f ...

  3. python 大智慧 dll_Python调用windows下DLL详解

    前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接.看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆协议的定义甚是齐全,好在官方的文件中也带有个封装 ...

  4. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序

    引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...

  5. C语言第五篇 python调用C语言写的动态链接库DLL文件

    学习目标:1.学会C语言写windows下的DLL文件.2.用gcc命令将C程序编译成DLL文件.3.学会用python调用C语言写的DLL. 学习内容1:先用C语言写一个简单程序,先建立dll.c文 ...

  6. 易语言如何调用c dll文件,易语言调用C++写的DLL

    直接调用会弹出堆栈错误的信息,原因是VS默认是__cdcel方式,而易语言是__stdcall,所以调用约定不一致导致堆栈错误. 解决方案很简单,易语言声明DLL函数时"在库中对应命令名&q ...

  7. 用python写脚本筛选原创微博_基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example ...

  8. 用python写脚本看什么书-终于知晓python编写脚本入门教程

    PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...

  9. c调用python第三方库_用 Python ctypes 来调用 C/C++ 编写的第三方库

    看到一篇简洁的文章--如何用Python ctypes调用C++(ctypes调用C没这么多麻烦事),不敢独享... 如果需要用 Python 调用 C/C++ 编写的第三方库(这些第三方库很可能就是 ...

最新文章

  1. 网站优化四大优势必须了解
  2. loadrunner 更新中......
  3. 监控 WebBrowser 控件内容的改变
  4. Mac查看Android动态库依赖
  5. RabbitMQ fanout交换机(消费者)
  6. 8个月打磨,一份送给程序员的「分布式系统」合集
  7. spring学习(46):spring的单例bean
  8. [SDOI 2010]外星千足虫
  9. 【堆】这是要搞事情啊——取出
  10. 哈希集合——hashSet
  11. 使用IBM SPSS Statistics的新手应该如何入门
  12. 电子信息工程专业打工人的蓝桥杯嵌入式竞赛时记
  13. 夜雨数竞笔记-中值问题(5)-泰勒中值定理
  14. 基于Milton的webdav解决方案 - Test
  15. ByteDance字节跳动张一鸣:如何阅读、如何了解自己、如何与人沟通沟通、如何安排时间、如何正确的看待别人意见、如何激励自己、如何写作、如何坚持锻炼身体、如何耐心?...
  16. 如何启用计算机网络,启用网络发现,教您win10怎么启用网络发现
  17. java awt canvas_java.awt 类 Canvas - Java 中文参考手册
  18. Python迷宫生成器
  19. 2020年全球权威机器人评选RBR50放榜:中国仅一家公司入选,大疆落榜
  20. 微信开发者工具更换存储目录将C盘数据User Data迁移到D盘

热门文章

  1. 你们真的了解JS的事件吗?
  2. 《中国人工智能学会通讯》——9.2 误差的本质
  3. Excel的导入与导出(POI)
  4. CVE-2020-0688 Exchange 远程代码执行分析
  5. JAVA8给我带了什么——并流行和接口新功能
  6. 数千万智能手机集体脱机?罪魁祸首是……
  7. 树莓派 4G模块 PPP 拨号 NDIS 拨号
  8. 洛谷——P1476 休息中的小呆
  9. 设计模式(五)——建造者模式
  10. 在banana pi 上测试 《S2A》Snap/Scratch to Arduino