Tôi đã sao chép chính xác mã ví dụ được đưa ra trong Cython documentation for wrapping C++ classes. Tôi có thể xây dựng thành công và nhập phần mở rộng rect.so
sử dụng distutils
và cythonize()
phương pháp, tức là bằng cách:Làm cách nào tôi có thể biên dịch mã Cython theo cách thủ công sử dụng C++?
Đưa các chỉ dẫn sau ở đầu
rect.pyx
:# distutils: language = c++ # distutils: sources = Rectangle.cpp
Viết một tập tin
setup.py
có chứa này:from distutils.core import setup from Cython.Build import cythonize setup( name = "rectangleapp", ext_modules = cythonize('*.pyx'), )
Gọi
$ python setup.py build_ext --inplace
Tuy nhiên, khi tôi đang gói mã C trong Cython tôi thường thấy nó thuận tiện hơn để biên dịch các phần mở rộng cá nhân bằng tay từ dòng lệnh, ví dụ:
Tạo mã
.c
bằng cách sử dụng dòng lệnh Cython biên dịch$ cython foo.pyx
thủ biên dịch nó bằng cách sử 012.306.:
$ gcc -shared -fPIC -O3 -I /usr/lib/python2.7 -L /usr/lib/python2.7 \ foo.c -lpython2.7 -o foo.so
Tôi đã thử áp dụng quá trình tương tự để xây dựng các ví dụ rect.so
trên:
$ 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
Cả Cython và g ++ bước biên soạn dường như thành công - Tôi không nhận được bất kỳ đầu ra dòng lệnh nào và cuối cùng tôi đã xây dựng rect.so
. Tuy nhiên, khi tôi sau đó cố gắng nhập module Tôi nhận được một lỗi 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ác thủ tục chính xác cho tay biên dịch mã Cython rằng kết thúc tốt đẹp các lớp C++ là gì?