在Linux上通过Python引用动态链接库

在Linux上通过Python引用动态链接库

测试环境

  • centos 6/7
  • gcc 4.8.5
  • python 2.7

编译动态链接库

示例程序

app.c  app.h  foo.py main.c

头文件定义app.h

int add(int a, int b);
int mul(int a, int b);

函数实现app.c

int add(int a, int b){
 return a+b;
}

int mul(int a, int b){
 return a*b;
}

C程序入口main.c

#include 
#include "app.h"

int main(){
 printf("3+5=%d\n",add(3,5));
 printf("3x5=%d\n",mul(3,5));
 return 0;
}

编译

编译动态链接库libapp.so

gcc -fpic -shared app.c -o libapp.so

编译main.c

#将libapp.so所在的路径加入变量动态库搜索路径,否则提示找不到libapp.so
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
#引用上一步生成的动态库,-lapp表示引用libapp.so
gcc -o test main.c -L ./ -lapp
#执行测试程序
./test
3+5=8
3x5=15

Python程序foo.py引用动态链接库

需要将libapp.so放在python解释器能够搜索到的路径,通过ctypes模块加载即可

import ctypes
so = ctypes.CDLL('libapp.so')
print(so.add(3,5))
print(so.mul(3,5))

运行结果

#同理,将动态库所在目录加入搜索路径,或者在ctypes.CDLL()函数中提供绝对路径
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
python foo.py
8
15

其它

其它如Python与C的数据类型、结构体、类的转换参考Python官方文档

你可能感兴趣的:(linux,python)