Python ctypes加载错误:未定义的符号

Posted

技术标签:

【中文标题】Python ctypes加载错误:未定义的符号【英文标题】:Python ctypes loading error: undefined symbol 【发布时间】:2013-07-18 06:57:59 【问题描述】:

我正在尝试使用 ctypes 将从 C 源代码编译的共享库加载到 Python 中。共享库(下面命名为“libsub.so”)使用了 libusb 库。这就是“make”所做的:

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”的源代码中。

StackExchange 中的一些帖子谈到了在使用 ctypes 加载 C++ 共享库时出现此类“未定义符号”错误,并且通过将编译器从 gcc 更改为 g++ 解决了问题。但是,我的源代码是用 C 编写的 --- 所以情况可能不同(实际上我尝试用 g++ 编译这个源代码,但出现了一堆错误)。谁能指出我在这里缺少什么?谢谢!

【问题讨论】:

我也遇到了同样的问题,我希望很想知道答案是否对您有所帮助,或者您是否找到了其他解决方案。 【参考方案1】:

我认为您应该在第二行中要求将您的 libsub.so 与指向原始 libusb.so 的指针链接在一起:

gcc -shared -Wl,-soname,libsub.so -lusb -o libsub.so libsub.o
                                  ^^^^^

也许您还需要使用-L/path 指定 libusb.so 的路径。

【讨论】:

以上是关于Python ctypes加载错误:未定义的符号的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:python:未定义符号:使用 ctypes 从 Python 访问 C++ 函数时

未在IE11上加载错误“符号”的Vue.js未定义

SWIG Python 未定义符号错误

Python OpenCV“ImportError:未定义符号”或内存访问错误

如何修复符号查找错误:集群环境中的未定义符号错误

如何解决这个错误?致命错误:在第X行的... / magento18 / lib / Zend / Uri.php中调用未定义的函数ctype_alnum()?