Python 调用 .so / .dll

python 调用 .so 文件

GCC编译参数解析

-shared: 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

1. 调用 C 动态链接库

通过C语言编写一个简单 max 函数:max.c

/*
 * # -shared 为链接库  让编译器知道是要编译一个共享库
 * # -fPIC(Position Independent Code)   编译生成代码与位置无关
 */
int max(int a,int b)
{
    return a>b?a:b;
}
/*
 * gcc -Wall -g  -fPIC -c max.c -o max.o
 * gcc -shared max.o -o max.so
 * -g -Wall 供调试使用,不是必须的<br> * 或者<br> * gcc max.c -fPIC -shared -o max.so
 */

编译生成 libmax.so

gcc -fPIC -shared max.c -o libmax.so

使用 Python 语言调用 libmax.so 链接库中的 max 函数

from ctypes import cdll
 
cur = cdll.LoadLibrary('./libmax.so')
a = cur.max(1, 2)
 
print(a)

2. 调用 C++ 动态链接库

通过C++编写 display.cpp

class TestLib  
{  
    public:  
        void display();  
        void display(int a);  
};  
void TestLib::display() {  
    cout<<"First display"<<endl;  
}  
  
void TestLib::display(int a) {  
    cout<<"Second display:"<<a<<endl;  
}  

//C++想要编译成python可以调用的.so文件,必须加以下代码:
extern "C" {  
    TestLib obj;  
    void display() {  
        obj.display();   
      }  
    void display_int(int a) {  
        obj.display(a);   
      }  
}

编译生成 libdisplay.so

g++ -fPIC -shared display.cpp -o libdisplay.so

python调用 生成的 libtest.so

demo.py

import ctypes

so = ctypes.cdll.LoadLibrary   
lib = so("./libpycallclass.so")   

print('display()')  
lib.display()  

print('display(100)')  
lib.display_int(ctypes.c_int(100))

运行 :

python demo.py


python 调用 .dll 文件

暂时先填上一个链接

https://blog.csdn.net/zmnbehappy/article/details/78697185

Prefrence

Python实例浅谈之三Python与C/C++相互调用

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值