lin*_*llo 9 python distutils cython undefined-reference
我想将我的一个c ++类作为Python模块提供.该类在头文件中声明,Foo.h并以.cpp实现Foo.cpp.(g ++ - 4.5,Ubuntu x86_64).这是一个非常简单的课程:
Foo.cpp:
Foo::Foo() : alfa(1.0), beta(1)
{
}
Foo::~Foo()
{
}
Run Code Online (Sandbox Code Playgroud)
Foo.h:
class Foo
{
public:
Foo()
Foo(const Foo& orig);
~Foo();
double alfa;
int beta;
};
Run Code Online (Sandbox Code Playgroud)
我创建了一个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},
)
Run Code Online (Sandbox Code Playgroud)
并按照cython教程的指示编写我的Foo.pyxcython模块:
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)
Run Code Online (Sandbox Code Playgroud)
我使用以下命令编译它:
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
Run Code Online (Sandbox Code Playgroud)
现在Foo.so创建了共享库对象,但是当我想从python导入它时,我得到:
>>> import Foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: ./Foo.so: undefined symbol: _ZN4FooD1Ev
>>>
Run Code Online (Sandbox Code Playgroud)
我认为_ZN4FooD1Ev是构造函数的错位名称,Foo但不明白如何丢失符号.
我真的无法理解共享对象文件中缺少什么符号.作为第二点,在python setup.py build_ext --inplace命令之后,我的Foo.cpp文件搞砸了并包含cythonized版本.
如何以其他格式重命名cythonized文件(例如.cxx)并避免链接器错误?
然后我修改了Foo.pyx的pFoo.pyx,因此修改了setup.py,现在setup命令后我的cythonized版本pFoo.pyx中Foo.cxx,但是当我试图导入我得到的
ImportError: dynamic module does not define init function (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
))
Run Code Online (Sandbox Code Playgroud)
要定义 C++ 类,请使用“cppclass”关键字,如下所示:
cdef extern from "Foo.h":
cdef cppclass Foo:
Foo()
double alfa
int beta
Run Code Online (Sandbox Code Playgroud)
然后你应该能够像这样访问你的类:
cdef Foo *foo = new Foo()
foo.beta = 42
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5677 次 |
| 最近记录: |