【Python】python调用C程序

区分:动态链接库DLL与静态链接库Lib

动态链接库(Dynamic Link Library,DLL)

是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

Windows下动态链接库的扩展名是dll,Linux下是so,Mac OS X下是dylib

它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。

如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。

静态链接库(static link library,Lib)

是在编译的链接期间使用的,他里面其实就是源文件的函数实现。

Lib库有两种,一种就是常见的普通Lib(static Lib),还有一种大家经常下载的开源代码编译后,会产生Lib和dll,其中Lib只是Dll的附带品,是DLL导出的函数列表文件而已,暂且称之为Dynamic Lib。

两者都是二进制文件,两者都是在链接是调用的,使用static lib的exe可直接运行,使用dynamic lib的exe需要对应的dll才能运行。

python调用C库

http://blog.csdn.net/taiyang1987912/article/details/44779719

不经过任何封装打包成so,再使用python的ctypes调用即可。

(1)C语言文件:pycall.c

[html] view plain copy
  1. /***gcc -o libpycall.so -shared -fPIC pycall.c*/  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. int foo(int a, int b)  
  5. {  
  6.   printf("you input %d and %d\n", a, b);  
  7.   return a+b;  
  8. }  
(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern "C"来进行编译。

(3)Python调用动态库的文件:pycall.py

[html] view plain copy
  1. import ctypes  
  2. ll = ctypes.cdll.LoadLibrary   
  3. lib = ll("./libpycall.so")    
  4. lib.foo(1, 3)  
  5. print '***finish***'  
(4)运行结果:



发布了397 篇原创文章 · 获赞 541 · 访问量 255万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览