2012-02-04 43 views
6

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.

+0

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

Trả lời

3

Xin chào , Tôi gặp vấn đề tương tự như của bạn dưới win7 32bit với mingw , tuy nhiên tôi đã khắc phục nó sau cùng.

Các giải pháp khả thi là:

Khi xây dựng tăng python lib, sử dụng liên kết = chia sẻ để thay thế.

như:

bjam stage toolset=gcc --with-python link=shared threading=multi runtime-link=shared variant=release,debug --user-config=user-config.jam cxxflags="-include cmath " 

Khi liên kết, sử dụng các macro BOOST_PYTHON_STATIC_LIB rõ ràng

Sau đây là mẫu cmd dòng:

g++ hello_ext.cpp -shared -O3 -DBOOST_PYTHON_STATIC_LIB -lboost_python -lpython25 -o hello_ext.pyd 

Để tiết kiệm thời gian của bạn, chỉ cần thêm một số dòng trong tệp boost\python.hpp

#include <cmath> //fix cmath:1096:11: error: '::hypot' has not been declared 
#if defined(__MINGW32__) && defined(_WIN32) 
#if !defined(BOOST_PYTHON_SOURCE) 
#define BOOST_PYTHON_STATIC_LIB 
#endif 
#endif 
... here,other includes files ... 

Sau đó, bạn chỉ có thể sử dụng cmd như thế này:

g++ hello_ext.cpp -shared -lboost_python -lpython25 -o hello_ext.pyd 

vỏ Đây sẽ là ok, có một thử.

4

Điều quan trọng là các tập tin thư viện được đặt tên giống như bạn khai báo các module ở đây:

BOOST_PYTHON_MODULE(hello_ext) 

đó là hello_ext.dll hoặc hello_ext.so.

+0

Đây là vấn đề của tôi, của tôi .so là tiền tố với '_' và cuộc gọi BOOST_PYTHON_MODULE của tôi là không. Cảm ơn! –

+0

Tôi chỉ có cùng một vấn đề, có tên mô-đun giống với tên libname dường như không giải quyết được vấn đề. Bất kỳ ý tưởng nào khác? Khi tôi chạy nm trên lib tôi không thấy nhiều biểu tượng bên trong nó, có lẽ python cần mọi thứ được liên kết trong? –

+0

@MaxShifrin Có thể bạn cần đăng câu hỏi khác. Nếu bạn làm như vậy, vui lòng thêm chi tiết về lý do tại sao các câu trả lời được đưa ra ở đây không hoạt động/áp dụng cho vấn đề của bạn. – moooeeeep