2011-01-04 56 views
10

example.h:Việc đóng gói một lớp C++ bằng Python sử dụng SWIG

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

class Math { 
public: 
    int pi() const; 
    void pi(int pi); 
private: 
    int _pi; 
}; 

#endif 

example.cpp:

#include "example.h" 

int Math::pi() const { 
    return this->_pi; 
} 
void Math::pi(int pi) { 
    this->_pi = pi; 
} 

example.swig:

%module example 
%{ 
    #define SWIG_FILE_WITH_INIT 
    #include "example.h" 
%} 
%include "example.h" 

Tôi là n tạo ra những gói "example.py" và "example_wrap.c" sử dụng:

swig -python example.swig 

Khi tôi cố gắng biên dịch lớp wrapper sử dụng:

g++ -fPIC -c example.cpp example_wrap.c -I/usr/local/include/python2.6/ 

tôi nhận được lỗi sau:

example_wrap.cpp: In function "PyObject* Swig_var_Math_get()": 
example_wrap.cpp:2725: error: expected primary-expression before "void" 
example_wrap.cpp:2725: error: expected ")" before "void" 

các Lỗi là tại dòng sau:

pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&Math), SWIGTYPE_p_class, 0); 

#define SWIG_as_voidptr(a) (void *)((const void *)(a)) 

Có đúng cách để tạo lớp trình bao bọc "example_wrap.c" không?

+0

Bạn gặp sự cố về định dạng khá tệ. –

+1

Không tệ đến thế, họ chỉ không biết thụt lề tất cả bốn mã. Đã sửa. – zwol

Trả lời

5

Không có đủ thông tin ở đây để chắc chắn điều gì sai, nhưng tôi có hai ý tưởng cho những điều bạn có thể thử.

  1. Gọi g++ của bạn đang biên soạn tệp nguồn C như thể nó là C++. Đây là không phải được bảo đảm hoạt động. Hãy thử thay

    gcc -I/usr/local/include/python2.6 -fPIC -c example_wrap.c 
    gcc -I/usr/local/include/python2.6 -fPIC -c example.cpp 
    g++ -shared example_wrap.o example.o -o example.so 
    

    (vâng, srsly, chỉ sử dụng g ++ cho liên kết)

  2. Nếu điều đó không làm việc, biên dịch example_wrap.c như thế này:

    gcc -I/usr/local/include/python2.6 -fPIC -c -save-temps example_wrap.c 
    

Đó sẽ không giống như vậy nhưng sẽ tạo ra một tệp có tên là example_wrap.i là kết quả của quá trình tiền sản xuất. Nó sẽ là khổng lồ. Tìm kiếm tệp đó cho hàm Swig_var_Math_get và thêm vào câu hỏi của bạn văn bản hoàn chỉnh của hàm đó (nhưng không có gì khác).

+0

Rất tiếc, example.cpp phải được biên dịch bằng g ++. Tại sao gcc? Tránh C++ mangling? – jweyrich

+1

Chỉ cần sử dụng 'g ++' để liên kết. 'gcc -c' làm Điều Đúng khi được áp dụng cho tệp nguồn' .cpp'. Nhưng 'g ++ -c' không * không * làm Điều Đúng khi được áp dụng cho tệp nguồn' .c'. Vì vậy, quy tắc dễ nhớ nhất là, luôn sử dụng 'gcc' để biên dịch, ngay cả khi nguồn là C++; chỉ sử dụng 'g ++' để liên kết một chương trình có chứa C++. Tương tự đối với bất kỳ ngôn ngữ nào khác được GCC hỗ trợ: chỉ sử dụng trình điều khiển dành riêng cho ngôn ngữ để liên kết. Cá nhân tôi không nghĩ rằng các trình điều khiển ngôn ngữ cụ thể nên thậm chí tồn tại, nhưng họ làm cho bạn không phải biết chính xác làm thế nào để gọi cho các thư viện thời gian chạy. – zwol

+0

, vâng, bạn có thể sử dụng gcc để biên dịch C++. Bạn cũng có thể sử dụng gcc để liên kết C++, nhưng bạn phải liên kết theo cách thủ công với libstdC++, v.v. Đặt theo cách đó, tôi thấy dễ sử dụng gcc cho C, và g ++ cho C++. Nhưng đó chỉ là sở thích cá nhân. Điều quan trọng là vấn đề và giải pháp đã được chỉ ra một cách chính xác. +1 – jweyrich

13

Tôi nghĩ lệnh swig phải là "swig -C++ -python example.swig"

0

Cảm ơn bạn đã phát lại!

Tùy chọn -C++ đã tạo lớp C++ cho trình bao bọc. swig -C++ -v -python example.swig

Tôi đã sử dụng g ++ để biên dịch trình bao bọc.

g++ -fPIC -c example.cpp example_wrap.cxx -I/usr/local/include/python2.6/ 

Và lệnh sau để buikd đối tượng được chia sẻ. Ofcourse, chúng ta cần phải loại bỏ các superflous bao gồm (-I) và thư viện (-L). Các lá cờ quan trọng là '-shared' và '-fPIC'.

g++ example_wrap.o example.o -L/u01/app/oracle/product/1020.full/lib -I/usr/local/ssl/include -L/usr/local/ssl/lib -lclntsh -lssl -lcrypto -ldl -L/usr/local/lib -L/lib64 -L/usr/local/lib/python2.6/ -lboost_system -lboost_filesystem -lboost_thread -lboost_date_time -lglog -lmodpbase64 -lpthread -ldl -lrt -shared -fPIC -o _example.so 
Các vấn đề liên quan