我已经完全复制了Cython documentation for wrapping C++ classes中给出的示例代码。我可以成功地建立和导入使用distutils
和cythonize()
方法rect.so
延伸,通过即:如何手动编译使用C++的Cython代码?
# distutils: language = c++
# distutils: sources = Rectangle.cpp
写setup.py
文件,其中包含:
在
rect.pyx
顶部把下面的指令这个:from distutils.core import setup from Cython.Build import cythonize setup( name = "rectangleapp", ext_modules = cythonize('*.pyx'), )
打电话
$ python setup.py build_ext --inplace
然而,当我包装C代码用Cython我经常发现它更方便手动命令行编译单个扩展,即:
生成
.c
代码使用命令行Cython编译器$ cython foo.pyx
使用手动编译它:
$ gcc -shared -fPIC -O3 -I /usr/lib/python2.7 -L /usr/lib/python2.7 \ foo.c -lpython2.7 -o foo.so
我已经尝试采用同样的工艺打造的rect.so
上面的例子:
$ cython --cplus rect.pyx
$ g++ -shared -fPIC -O3 -I /usr/lib/python2.7 -L /usr/lib/python2.7 \
rect.cpp -lpython2.7 -o rect.so
无论是用Cython和g ++编译步骤似乎成功 - 我不明白任何命令行输出,并在最后我有一个rect.so
内置。然而,当我再尝试导入模块我得到一个错误undefined symbol
:
In [1]: import rect
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-ba16f97c2145> in <module>()
----> 1 import rect
ImportError: ./rect.so: undefined symbol: _ZN6shapes9Rectangle9getLengthEv
什么是手动编译一个封装C++类用Cython代码正确的程序?