【发布时间】: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