Расширение Python / C ++. При импорте я получаю неопределенную ошибку символа - PullRequest
1 голос
/ 01 июля 2019

Мои файлы setup.py и UserMethods.cpp находятся ниже.

Моя проблема заключается в следующем: я пытаюсь создать и установить пакет python, используя distutils, и у меня возникают некоторые проблемы.

Когда я запускаю 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

, который возвращает следующую ошибку:

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 Ответ

0 голосов
/ 03 июля 2019

согласно @Holt выше, эта ошибка была вызвана тем, что не был импортирован библиотека, содержащая определение типа в ошибке.

Мне нужно было добавить путь к библиотеке на этапе компоновки, который я добавил к аргументу extra_link_args в вызове функции Extension в Setup.py.

...