Vì vậy, tôi tìm kiếm công cụ tốt để tích hợp mã C++ của tôi với python, và lúc đầu tôi xem boost.python.C++ Boost.Python: 2 vấn đề
Tôi nhận được lời chào hỏi từ tài liệu nâng cao và cố gắng xây dựng và chạy nó. Mã nguồn (src/hello.cpp):
#include <Python.h>
#include <boost/python.hpp>
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
Vấn đề 1 - Windows và mingw
tôi cố gắng xây dựng và kết quả của tôi:
g++ -o build\hello.o -c -IE:\Programming\libs\boost_1_48_0 -IE:\Programming\Python\include src\hello.cpp
g++ -shared -o pyhello.dll build\hello.o -LE:\Programming\libs\boost_1_48_0\stage\lib -LE:\Programming\Python\libs -lboost_python-mgw45-mt-1_48 -lpython27 -Wl,--out-implib,libpyhello.a
Creating library file: libpyhello.a
build\hello.o:hello.cpp:(.text+0x20): undefined reference to `_imp___ZN5boost6python6detail11init_moduleEPKcPFvvE'
Cũng tương tự như 4 lỗi không xác định với boost :: python.
tôi xây dựng tăng dòng lệnh: bjam toolset=gcc variant=release
tôi thấy khó khăn tương tự trong google (và trên stackoverflow quá), nhưng không tìm thấy câu trả lời ở trường hợp của tôi.
Vấn đề 2 - Sử dụng mô-đun (linux)
Tại nền tảng Linux tôi đã không có vấn đề với module xây dựng, cùng một nguồn biên soạn tốt:
g++ -o build/hello.os -c -fPIC -I/usr/include/python2.7 src/hello.cpp
g++ -o libpyhello.so -shared build/hello.os -lboost_python -lpython2.7
Bây giờ, làm thế nào tôi có thể sử dụng? Trong tài liệu không lời về mô-đun đặt tên, quote:
có thể được tiếp xúc với Python bằng cách viết một wrapper Boost.Python:
#include <boost/python.hpp> BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); }
Vậy là xong. Đã được thực hiện. Bây giờ chúng ta có thể xây dựng nó như một thư viện được chia sẻ. Các kết quả DLL bây giờ có thể nhìn thấy Python. Đây là một mẫu Python phiên:
>>> import hello_ext >>> print hello_ext.greet() hello, world
Vì vậy, mô-đun của tôi tên là: libpyhello.so, nhưng làm thế nào tôi có thể sử dụng nó trong python iterpreter? Tôi cố gắng pyhello nhập khẩu, hello_ext, libpyhello - và chỉ với libpyhello thông dịch viên được in:
ImportError: dynamic module does not define init function (initlibpyhello)
Tất cả các biến thể khác của nhập thất bại với: ImportError: No module named pyhello
CẬP NHẬT 2 câu hỏi: Solved, * .so mô-đun phải được đặt tên là ID được sử dụng trong BOOST_PYTHON_MODULE. Sau khi tôi thay đổi: BOOST_PYTHON_MODULE(hello_ext)
thành BOOST_PYTHON_MODULE(libpyhello)
, mô-đun được nhập cũng như libpyhello.
Bạn nên tự trả lời và chấp nhận câu trả lời của riêng mình. – moooeeeep