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/zmnbehappy/article/details/78697185
Prefrence
Python实例浅谈之三Python与C/C++相互调用
更多推荐
Python 调用 .so / .dll
发布评论