Python/C++扩展。导入时出现未定义符号错误。

3
我的 setup.pyUserMethods.cpp 文件如下。
我的问题是:我尝试使用 distutils 创建和安装一个 Python 包,但遇到了一些问题。
当我运行 python3 setup.py install --user 时没有问题。它会编译并创建一个名为 lib.linux-x86_64-3.6 的文件夹。当我检查我的 .local/lib/python3.6/site-pacages 目录时,发现有一个名为 UserMethods.cpython-36m-x86_64-linux-gnu.so 的文件。
问题出现在我尝试导入包时:
$ python3
>>> import UserMethods

这会返回以下错误:

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);

}

1
UserMethods.cppsetup.py的内容是什么?这看起来像是您用于编译库的编译器与用于编译Python的编译器之间的不兼容性。 - Holt
1
该符号是 NA62Analysis::Core::AnalyzerIdentifier::~AnalyzerIdentifier() 的混淆版本(来源:c++filt - Daniel Schepler
@Holt 我添加了所请求的代码。我尝试注释掉 #include UserMethods.hh 这一行,一切都编译得很好。我认为这与编译器如何导入模块有关? - Dane Cross
我应该按照特定的顺序编写我的“include_dirs”列表吗?我有大约20个包含目录。 - Dane Cross
1
@DaneCross 显然你正在使用 NA62Analysis,所以你可能需要将所需的动态库添加到你的 PATH 中。 - Holt
1个回答

0

根据@Holt的说法,这个错误是由于没有导入包含错误类型定义的库引起的。

我不得不在链接步骤中添加库的路径,我将其添加到Setup.py中Extension函数调用中的'extra_link_args'参数中。


你能发布所需的setup.py代码更改吗? - bmillare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接