Неопределенная ошибка символов при импорте модуля Cython

Я хочу сделать доступным один из моих классов C ++ в качестве модуля Python. Класс объявлен в заголовкеFoo.h и реализован в .cppFoo.cpp, (g ++ - 4.5, Ubuntu x86_64). Это'очень очень простой класс :::

Foo.cpp

Foo::Foo() : alfa(1.0), beta(1)
{

}

Foo::~Foo()
{
}

Foo.h

 class Foo
 {
 public:

  Foo()
  Foo(const Foo& orig);
  ~Foo();
  double alfa;
  int beta; 
 };

Я создалsetup.py как показано в руководстве по Cython:

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
  name = 'MyDemo',
  ext_modules=[
    Extension("Foo"
          sources=["Foo.pyx"], 
          include_dirs=[".","../eigen/"],
          language="c++"),
    ],
  cmdclass = {'build_ext': build_ext},
)

и следовал инструкциям учебника по Cython, чтобы написать мойFoo.pyx модуль Cython:

Foo.pyx

cdef extern from "Foo.h":
    ctypedef struct c_Foo "Foo":
        double alfa
    c_Foo *new_Foo "new Foo" ()
    void del_Foo "delete" (c_Foo *myfoo)

cdef class Foo:
    cdef c_Foo *thisptr      # hold a C++ instance which we're wrapping
    def __cinit__(self):
         self.thisptr = new_Foo()
    def __dealloc__(self):
         del_Foo(self.thisptr)

Я компилирую его с помощью следующей команды:python setup.py build_ext --inplace

running build_ext
skipping 'Foo.cpp' Cython extension (up-to-date)
building 'Foo extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I. -I../eigen/ -I/usr/include/python2.6 -c Foo.cpp -o build/temp.linux-x86_64-2.6/Foo.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.6/Foo.o -o /home/linello/prova/Foo.so

ТеперьFoo.so объект разделяемой библиотеки создается, но когда я хочу импортировать его из python, я получаю:

 >>> import Foo
      Traceback (most recent call last):
      File "", line 1, in 
      ImportError: ./Foo.so: undefined symbol: _ZN4FooD1Ev
>>> 

я думаю что_ZN4FooD1Ev искаженное имя конструктораFoo но нене понимаю, как не хватает символа.

Я действительно могуне понимаю, какой символ отсутствует в общем объектном файле. И как второй пункт, послеpython setup.py build_ext --inplace команда мояFoo.cpp файлиспортил и содержит цифонизированную версию.

Как можно переименовать цифонизированный файл в другой формат (например.cxx) и избежать этой ошибки компоновщика?

Затем я изменилFoo.pyx вpFoo.pyx и, следовательно, изменилsetup.pyТеперь, после команды установки, у меня есть версияpFoo.pyx вFoo.cxx но когда я пытаюсь импортировать, я получаю

ImportError: dynamic module does not define init function (initpyFoo)

Что не так с моей настройкой и как можно решить мои проблемы?

Ответы на вопрос(1)

Ваш ответ на вопрос