我一直在python中试验C模块,编译没有问题。但是,当导入模块时,我收到以下错误消息:
>>> import _strrev
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /path/to/my/module.so: undefined symbol: strrev
文件的内容为
- _strrev.c*
#include <Python.h>
#include <string.h>
static PyObject* _strrev(PyObject* self, PyObject *args) {
PyObject* name;
if (!PyArg_ParseTuple(args, "U", &name)) {
return NULL;
}
PyObject *ret = strrev(*name);
return ret;
}
static struct PyMethodDef methods[] = {
{"strrev", (PyCFunction)_strrev, METH_VARARGS},
{NULL, NULL}
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"_strrev",
NULL,
-1,
methods
};
PyMODINIT_FUNC PyInit__strrev(void) {
return PyModule_Create(&module);
}
- setup.py*
from distutils.core import setup, Extension
setup(
name='strrev_lib',
version='1',
ext_modules=[Extension('_strrev', ['_strrev.c'])],
)
在此对象文件上运行nm -D时,我得到以下输出
$ nm -D _strrev.cpython-39-x86_64-linux-gnu.so
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U PyArg_ParseTuple
00000000000011a0 T PyInit__strrev
U PyModule_Create2
U __stack_chk_fail@GLIBC_2.4
U strrev
我可以看到strrev在这里,所以我不明白为什么它说符号在undefined中。
我还尝试使用不同的模块,当试图导入它时,它工作得非常好。
$ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import _hello
>>> _hello.hello("Jared")
'hello Jared'
文件的内容包括:_hello.c
#include <Python.h>
static PyObject* _hello(PyObject* self, PyObject *args) {
PyObject* name;
if (!PyArg_ParseTuple(args, "U", &name)) {
return NULL;
}
PyObject *ret = PyUnicode_FromFormat("hello %U", name);
return ret;
}
static struct PyMethodDef methods[] = {
{"hello", (PyCFunction)_hello, METH_VARARGS},
{NULL, NULL}
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"_hello",
NULL,
-1,
methods
};
PyMODINIT_FUNC PyInit__hello(void) {
return PyModule_Create(&module);
}
- setup.py*
from setuptools import setup
from setuptools import Extension
setup(
name='hello-lib',
version='1',
ext_modules=[Extension('_hello', ['_hello.c'])],
)
谁能给予我一下我做错了什么?是因为编译还是因为我写的代码?任何帮助将不胜感激!
1条答案
按热度按时间9jyewag01#
我可以看到strrev在这里,所以我不明白为什么它说符号在undefined中。
Au:你可以看到
strrev
是 not there --nm
输出中的U
意味着 undefined。strrev
看起来是Windows thing,而且你不是在Windows上。在GLIBC中没有这样的符号:要解决这个问题,您需要自己实现
strrev()
。