python调用c++技术总结

1、在linux系统下,cpp可通过cmake与make或者g++编译生成.so文件。python通过ctypes库调用生成的.so文件。
2、因此,需要在.so文件中定义相关函数接口,并在python中选择对应的数据类型传入。
python调用c++技术总结_第1张图片
3、.so文件可能是层层依赖的,因此需要将所有相关的.so文件载入。如果一个.so依赖另一个.so文件。在python代码中可通过
CDLL(“libstdc++.so.6”,mode=ctypes.RTLD_GLOBAL)
CDLL(“libguide.so”,mode=ctypes.RTLD_GLOBAL)
这类命令载入,解决.so互相依赖的问题。
4、通过dll=cdll.LoadLibrary(‘libmain.so’),载入主程序的.so文件。然后通过dll调用main.cpp中的相关函数接口,实现最终调用。
5、若需要从python中传输字符串到c++程序中,需要在字符串前面加上b,即将字符串以byte形式传入c++中。例如opt_AbsolutePath=b"/root/..."。
6、若在调用过程中需要采用回调函数传入c++并拿到结果,代码编写示例过程如下。
CALLFUNC = ctypes.CFUNCTYPE(ctypes.POINTER(Task),ctypes.c_int,ctypes.c_int)
这代表回调传入的是一个结构体指针与两个int值。
在python中对结构体的定义示例如下:
class Task(ctypes.Structure):
fields = [(“new”,ctypes.c_void_p),#如果new是一个结构体指针
(“next”,ctypes.c_void_p),#如果next为Task指针
(“Num”,ctypes.c_int),
(“save”,ctypes.c_ulong),
(“data”,ctypes.c_ulong),
(“Id”,ctypes.c_long),
(“End”,ctypes.c_ulong),
(“Type”,ctypes.c_int)]
然后在python中定义回调函数:
def callbackFun(Taskarray,numberOfTasks,Id):#对应CFUNCTYPE的参数值
print(“callback sucess”)
dll.setcallbackfunc(CALLFUNC(callbackFun))
最后通过CALLFUNC将定义的回调函数传入,再通过dll将CALLFUNC传入到.so中。
7、main.cpp的编写中,需要在定义函数外层加入extern “c”{ … },例如:
extern “c”{
void test()
{
cout<<“test”< }
}
python:用dll.test()调用即可。
8、如果出现在编译.so过程中出现undefined symbol错误,说明某些定义的函数未加载进当前的include或者软连接库中,可通过echo xxx| c++filt 查看symbol的原始函数或者用nm | grep寻找函数所在路径,加入到环境变量~/.bashrc或者CMakeList.txt、g++的-I -L中。
9、如果期望得到回传结构体中的数据,可通过:
print(Taskarray.contents.Num)的方式获得。

你可能感兴趣的:(python调用c++,linux,c++,python)