【问题标题】:Custom C module includes自定义 C 模块包括
【发布时间】:2018-03-29 18:07:31
【问题描述】:

我正在尝试用 C 构建一个 Python 模块,但遇到了一个问题:

当我包含额外的头文件(test.h)时,模块编译时没有警告,但后来在import 这个模块上,Python 抱怨未定义符号maketest

我的模块结构是这样的(模块名为spam):

spam\
    ├spammodule.c
    |setup.py
    ├─src\
         |── test.c
         |── test.h

spammodule.c的内容:

#include <Python.h>
#include "test.h"

static PyObject * SpamError;

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    maketest(); // <---- calling function from additional file

    if(!PyArg_ParseTuple(args, "s", &command))
        return NULL;

    sts = system(command);
    if ( sts < 0 ) {
        PyErr_SetString(SpamError, "System command failed");
        return NULL;
    }
    return PyLong_FromLong(sts);
}

PyMODINIT_FUNC
initspam(void)
{
    PyObject *m;
    static PyMethodDef SpamMethods[] = {
        {"system", spam_system, METH_VARARGS, "Execute a shell command."},
        {NULL, NULL, 0, NULL}
    };
    m = Py_InitModule("spam", SpamMethods);
    if ( m == NULL )
        return;

    SpamError = PyErr_NewException("spam.error", NULL, NULL);
    Py_INCREF(SpamError);
    PyModule_AddObject(m, "error", SpamError);
}

int
main(int argc, char *argv[])
{
    Py_SetProgramName(argv[0]);
    Py_Initialize();
    initspam();
}

setupy.py的内容:

from setuptools import setup,Extension

spam_module = Extension('spam',
        sources = ['spammodule.c'],
        include_dirs=['src/'],)

setup ( name = 'Spam',
    version = '1.0',
    description = 'Sample module.',
    ext_modules = [ spam_module ])

src/test.h的内容:

void maketest(void);

src/test.c的内容:

#include "test.h"

void maketest() {
    printf("test passed");
}

我使用python setup.py build 编译所有内容,运行 Python 提示符后我尝试导入我的模块并收到错误:

Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import spam
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./spam.so: undefined symbol: maketest

有人知道发生了什么吗?

【问题讨论】:

  • 您在src/test.c 的目标文件中绝对无处链接到.so。将src/test.c 添加到源列表。
  • 你说得对,我认为包括src/* 文件就足够了,但是不,正如你所说的,其他文件应该列在源元组中,谢谢。我在帖子中添加了答案
  • 不,您应该将您的答案发布答案。然后接受它

标签: python c python-2.7 cpython


【解决方案1】:

好的,谢谢 Antii 提供线索,因为您说问题是 test.c 应该包含在源元组中 所以我修改了 setup.py 一切正常 现在它看起来像这样:

from setuptools import setup,Extension

spam_module = Extension('spam',
        sources = ['spammodule.c','src/test.c'],
        include_dirs=['src/'])

setup ( name = 'Spam',
    version = '1.0',
    description = 'Sample module.',
    ext_modules = [ spam_module ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多