Python/C++ 扩展名。导入时,出现未定义的符号错误
Python/C++ extension. On import, I get an undefined symbol error
我的 setup.py 和 UserMethods.cpp 文件如下。
我的问题是:我正在尝试使用 distutils
创建和安装 python 程序包,但我 运行 遇到了一些问题。
当我运行 python3 setup.py install --user
时没有问题。它编译并创建一个 build/
目录,其中包含一个名为 lib.linux-x86_64-3.6
的文件。当我检查我的 .local/lib/python3.6/site-pacages
目录时,有一个名为 UserMethods.cpython-36m-x86_64-linux-gnu.so
的文件。
当我尝试导入包时出现问题:
$ python3
>>> import UserMethods
其中returns出现以下错误:
ImportError: ~/.local/lib/python3.6/site-packages/UserMethods.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN12NA62Analysis4Core18AnalyzerIdentifierD1Ev
我不知道这样的符号是如何定义的,在哪里定义的,也不知道为什么要创建它。有没有人知道这个错误是从哪里来的?提前致谢。
编辑:
这是 setup.py 文件:
from distutils.core import setup, Extension
UM_module = Extension('UserMethods', sources=['UserMethodsModule.cpp'], language='C++',
include_dirs=[ ...many... ],
extra_compile_args=['-std=c++11'],
libraries=['stdc++'],)
setup(name='UserMethods',
version='1.0',
ext_modules=[UM_module],
)
这是我的 UserMethods.cpp 文件:
#include <Python.h>
#define PY_SSIZE_T_CLEAN
#include "UserMethods.hh"
/* OUR FUNCTIONS GO HERE */
static PyObject* UM_test(PyObject *self, PyObject *args){
const char *command;
int sts;
if ( !PyArg_ParseTuple(args, "s", &command) ){
return NULL;
}
sts = system(command);
return PyLong_FromLong(sts);
}
static PyMethodDef UserMethods[] = {
{"system", UM_test, METH_VARARGS, "execute shell command."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef UserMethodsModule = {
PyModuleDef_HEAD_INIT,
"UserMethods",
NULL,
-1,
UserMethods
};
PyMODINIT_FUNC PyInit_UserMethods(void){
return PyModule_Create(&UserMethodsModule);
}
根据上面的@Holt,这个错误是由于没有导入错误中包含类型定义的库造成的。
我必须在我的链接步骤中添加库的路径,我将其添加到 Setup.py 中扩展函数调用的 'extra_link_args' 参数中。
我的 setup.py 和 UserMethods.cpp 文件如下。
我的问题是:我正在尝试使用 distutils
创建和安装 python 程序包,但我 运行 遇到了一些问题。
当我运行 python3 setup.py install --user
时没有问题。它编译并创建一个 build/
目录,其中包含一个名为 lib.linux-x86_64-3.6
的文件。当我检查我的 .local/lib/python3.6/site-pacages
目录时,有一个名为 UserMethods.cpython-36m-x86_64-linux-gnu.so
的文件。
当我尝试导入包时出现问题:
$ python3
>>> import UserMethods
其中returns出现以下错误:
ImportError: ~/.local/lib/python3.6/site-packages/UserMethods.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN12NA62Analysis4Core18AnalyzerIdentifierD1Ev
我不知道这样的符号是如何定义的,在哪里定义的,也不知道为什么要创建它。有没有人知道这个错误是从哪里来的?提前致谢。
编辑: 这是 setup.py 文件:
from distutils.core import setup, Extension
UM_module = Extension('UserMethods', sources=['UserMethodsModule.cpp'], language='C++',
include_dirs=[ ...many... ],
extra_compile_args=['-std=c++11'],
libraries=['stdc++'],)
setup(name='UserMethods',
version='1.0',
ext_modules=[UM_module],
)
这是我的 UserMethods.cpp 文件:
#include <Python.h>
#define PY_SSIZE_T_CLEAN
#include "UserMethods.hh"
/* OUR FUNCTIONS GO HERE */
static PyObject* UM_test(PyObject *self, PyObject *args){
const char *command;
int sts;
if ( !PyArg_ParseTuple(args, "s", &command) ){
return NULL;
}
sts = system(command);
return PyLong_FromLong(sts);
}
static PyMethodDef UserMethods[] = {
{"system", UM_test, METH_VARARGS, "execute shell command."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef UserMethodsModule = {
PyModuleDef_HEAD_INIT,
"UserMethods",
NULL,
-1,
UserMethods
};
PyMODINIT_FUNC PyInit_UserMethods(void){
return PyModule_Create(&UserMethodsModule);
}
根据上面的@Holt,这个错误是由于没有导入错误中包含类型定义的库造成的。
我必须在我的链接步骤中添加库的路径,我将其添加到 Setup.py 中扩展函数调用的 'extra_link_args' 参数中。