最近调一个红外摄像头,后续做红外视频检测和识别。厂家给的SDK是C++写的,也不好做二次开发,只好用python再做一次封装。
更新一个工具,pybind11,方便调用C++动态链接库
举个例子,python要调用SDK.cpp里面的函数,需要把SDK.cpp封装成libSDK.so的动态依赖库来调用。
g++ SDK.cpp -fPIC -shared -o libSDK.so
封装好后,python的脚本里调用
import ctypes
from ctypes import *
if __name__ == '__main__':
ll = ctypes.cdll.LoadLibrary
libmain = ll("./libSDK.so")#引用libSDK.so
ret = libSDK.setup()#这里就可以调用SDK.cpp里的方法啦
如果运行python脚本的时候报错,某一个函数未定义,甚至在SDK.cpp里又没有找到这个函数。说明函数Function,依赖其他的动态依赖库,在封装的时候,要链接依赖的so文件。
OSError: ./libSDK.so: undefined symbol: Function
举个例子,SDK.cpp依赖lib_A.so和lib_B.so动态依赖库,所以要链接这两个so文件,才能调用SDK.so