Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导入Cython模块时出现未定义的符号错误 我想把我的C++类之一作为Python模块。该类在头文件Foo.h中声明,并在.cppFoo.cpp中实现。 (g++-4.5,Ubuntu x86_64)。这是一个非常简单的类:_Python_Cython_Distutils_Undefined Reference - Fatal编程技术网

导入Cython模块时出现未定义的符号错误 我想把我的C++类之一作为Python模块。该类在头文件Foo.h中声明,并在.cppFoo.cpp中实现。 (g++-4.5,Ubuntu x86_64)。这是一个非常简单的类:

导入Cython模块时出现未定义的符号错误 我想把我的C++类之一作为Python模块。该类在头文件Foo.h中声明,并在.cppFoo.cpp中实现。 (g++-4.5,Ubuntu x86_64)。这是一个非常简单的类:,python,cython,distutils,undefined-reference,Python,Cython,Distutils,Undefined Reference,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 d

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\u 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 "<stdin>", line 1, in <module>
      ImportError: ./Foo.so: undefined symbol: _ZN4FooD1Ev
>>> 
导入Foo 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 导入错误:./Foo.so:未定义符号:ZN4FooD1Ev >>> 我认为\u ZN4FooD1Ev
Foo
的构造函数的损坏名称,但我不明白它是如何丢失符号的

我真的无法理解共享对象文件中缺少了什么符号。 作为第二点,在执行
python setup.py build\u ext--inplace
命令之后,我的
Foo.cpp
文件被弄乱了,并且包含了cythonized版本

如何以另一种格式(例如
.cxx
)重命名cythonized文件并避免链接器错误

然后,我在
pFoo.pyx
中修改了
Foo.pyx
,并因此修改了
setup.py
,现在在setup命令之后,我在
Foo.cxx
中获得了
pFoo.pyx
的cythonized版本,但当我尝试导入时,我得到了

ImportError:动态模块未定义初始化函数(initpyFoo)


我的设置有什么问题?如何解决我的问题?

我建议您为cython模块使用不同的名称,例如cFoo,以避免名称冲突问题:

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize(
           "cFoo.pyx",                 # our Cython source
           sources=["Foo.cpp"],        # additional source file(s)
           language="c++",             # generate C++ code
      ))
< P>定义C++类,使用“CPPPCYPE”关键字,如下:

cdef extern from "Foo.h":
    cdef cppclass Foo:
        Foo()
        double alfa
        int beta
然后,您应该能够像这样访问您的类:

cdef Foo *foo = new Foo()
foo.beta = 42

Foo类是否在cpp文件中定义了它的复制构造函数?不,它实际上没有定义复制构造函数,当在
pyFoo.pyx
中定义并重命名
Foo.pyx
时,我解决了这个问题。