我试图使用ctypes将从C源编译的共享库加载到Python中。共享库(下面名为“ libsub.so ”)使用 libusb 库。这就是“制造”所做的:
gcc -c -O2 -Wall -Werror -g -I../src -I../boot/vnd/fw -I. -fPIC -DLIBUSB_1_0 -I/usr/include/libusb-1.0 -o libsub.o libsub.c
gcc -shared -Wl,-soname,libsub.so -o libsub.so libsub.o
之后我尝试了Python:
import ctypes
h = ctypes.cdll.LoadLibrary('./libsub.so')
然而,我收到了这样的错误
OSError: ./libsub.so: undefined symbol: libusb_open
我发现“libusb_open”实际上是“/usr/include/libusb-1.0/libusb.h”中libusb头的一个函数,它已经包含在这个库“libsub.c”的源代码中。
当使用ctypes加载C ++共享库时,StackExchange中的一些帖子讨论了这种“未定义的符号”错误,并且通过将编译器从gcc更改为g ++来解决问题。但是,我的源代码是用C语言编写的 - 所以它可能是一个不同的情况(实际上我尝试使用g ++编译这个源代码但得到了一堆错误)。任何人都可以指出我在这里失踪了吗?谢谢!
答案 0 :(得分:5)
我相信你应该在第二行中要求你的libsub.so与指向原始libusb.so的指针链接在一起:
gcc -shared -Wl,-soname,libsub.so -lusb -o libsub.so libsub.o
^^^^^
也许您还需要使用-L/path
指定libusb.so的路径。