【发布时间】:2015-02-06 12:47:13
【问题描述】:
我已经完全复制了Cython documentation for wrapping C++ classes 中给出的示例代码。我可以使用distutils 和cythonize() 方法成功构建和导入rect.so 扩展,即通过:
-
将以下指令放在
rect.pyx的顶部:# distutils: language = c++ # distutils: sources = Rectangle.cpp -
编写一个包含以下内容的
setup.py文件:from distutils.core import setup from Cython.Build import cythonize setup( name = "rectangleapp", ext_modules = cythonize('*.pyx'), ) -
打电话
$ python setup.py build_ext --inplace
但是,当我在 Cython 中包装 C 代码时,我经常发现从命令行手动编译单个扩展更方便,即:
-
使用命令行 Cython 编译器生成
.c代码$ cython foo.pyx -
使用
gcc手动编译:$ 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 代码的正确过程是什么?
【问题讨论】: