Python导入错误:自定义C模块的未定义符号

3qpi33ja  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(124)

我一直在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'])],
        )

谁能给予我一下我做错了什么?是因为编译还是因为我写的代码?任何帮助将不胜感激!

9jyewag0

9jyewag01#

我可以看到strrev在这里,所以我不明白为什么它说符号在undefined中。
Au:你可以看到strrevnot there --nm输出中的U意味着 undefined
strrev看起来是Windows thing,而且你不是在Windows上。在GLIBC中没有这样的符号:

$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep strrev
$

要解决这个问题,您需要自己实现strrev()

相关问题