最近要做 SDK 测试,SDK 是由 C 语言封装成的,函数封装在了 .so动态库中,而且该动态库还依赖其他的第三方动态库,不知道该怎么调用,求助各位大神,给个 demo
ps: linux平台的库
#call_c.py
import ctypes
from ctypes import *
ll = ctypes.cdll.LoadLibrary
lib = ll("./libIFaceRecSDK.so")
单独调用就大概是上面这样子了,但 libIFaceRecSDK.so 这个动态库还依赖其他库,且带有头文件时,我该怎么调用啊??你们看,这个库还依赖以下的这多么的库,还有头文件!!求救!

|      1mashiro233      2018-05-28 11:47:56 +08:00 遇到这种情况,我的解决方法就是要么自己封装一个 C 模块给 py,要么 FFI。前者偏向调用复杂模块的时候,后者偏向调用简单模块。 另外这个依赖和你没多少关系,系统或者 libffi 会帮你解决。 给个 CFFI 参考链接。 https://eli.thegreenplace.net/2013/03/09/python-ffi-with-ctypes-and-cffi/ | 
|      2wsds OP | 
|  |      3wellsc      2018-05-28 12:03:39 +08:00 via iPhone Cffi 了解一下 | 
|      4wsds OP @mashiro233 调不通啊,报错 | 
|  |      5qieqie      2018-05-28 18:33:50 +08:00 你只需要知道返回值和参数列表的类型,不需要头文件。 ld-linux.so 会帮你找到依赖。 ``` import ctypes lib = ctypes.CDLL('libm.so.6') func = getattr(lib, 'pow') func.argtypes = [ctypes.c_double, ctypes.c_double] func.restype = ctypes.c_double print (func(2, 10)) ``` | 
|  |      6Shazoo      2018-05-28 18:51:45 +08:00 我觉得有点像比较初级的库路径问题。可能是你的 LD_LIBRARY 设置有些问题。 一般做这种工作的步骤大概是: 1、先写个 C 的程序,简单调用下 SDK 功能。如果 C 程序链接、运行有问题,那就及时解决。 2、C 程序搞定后,再弄成 python 库。 一般来说,库都会依赖不少第三方和系统库。这部分依赖,一般做的好的 SDK 是无需关心的。只要能搜索到就可以。做的不好的 SDK,也应该可以在步骤 1 解决掉。 参考下? http://oi.0w0.io/2018/01/05/Ubuntu-16-04-Python3-%E9%85%8D%E7%BD%AESQLite3-%E7%9A%84-icu-%E5%88%86%E8%AF%8D/#more | 
|      7wsds OP @qieqie 首先就是用的 ctypes 的,调用 so 报错:undefined symbol: _ZN6apache6thrift12GlobalOutputE 然后才换的 cffi | 
|      10wevsty      2018-05-28 19:34:26 +08:00 @wsds  undefined symbol: _ZN6apache6thrift12GlobalOutputE 表示的是找不到_ZN6apache6thrift12GlobalOutputE 这个函数,这个函数可能是哪个 so 中引用了,但是你系统里面没有。 google 一下这个函数大概是来自这些 so 文件 /usr/lib64/libthriftnb.so.0.0.0 /usr/lib/libthriftz-1.0.0-dev.so 所以你得看你系统是否安装了 libthrift ?或者版本是否正确? | 
|      11gnaggnoyil      2018-05-28 19:37:53 +08:00 _ZN6apache6thrift12GlobalOutputE 不出意外应该是来自 Apache Thrift 的库的 symbol.LZ 你 Apache Thrift 装了没? @wsds 人家说的是你那个库的依赖库没配置好,你为什么要强调你的"代码怎么着怎么着"...... | 
|  |      12lonccc      2018-05-28 19:38:57 +08:00 via Android pybind11 了解一下 | 
|      13wsds OP @wevsty lib 下有这个库 libthrift.so | 
|      15wevsty      2018-05-28 20:11:30 +08:00 @wsds  Linux 默认不会搜索工作目录这样,如果 so 不是在 /usr/lib 或者 /lib 这样的地方,那么就需要你指定路径。 可以修改 /etc/ld.so.conf 这样来加载,但是既然缺少库,用包管理安装一下不是更好么? | 
|      16wsds OP @wevsty 我试过绝对路径,也是还是提示:undefined symbol: _ZN6apache6thrift12GlobalOutputE  ``` from cffi import FFI ffi = FFI() # ffi.cdef() lib_IOTCAPIs = ffi.dlopen("/home/install/linux/x86_64/lib/libthrift.so") lib_IOTCAPIs = ffi.dlopen("/home/lib/cpu/libIFaceRecSDK.so") print('Loaded lib {0}'.format(lib)) ``` | 
|  |      18qieqie      2018-05-29 00:12:04 +08:00 @wsds export LD_LIBRARY_PATH=/home/install/linux/x86_64/lib:$LD_LIBRARY_PATH | 
|  |      19Shazoo      2018-05-29 09:40:11 +08:00 | 
|      21AX5N      2018-05-29 11:00:48 +08:00 |