2012-05-25 39 views
12

Chúng tôi có một nhà cung cấp đã cung cấp cho chúng tôi thư viện và tiêu đề C++, rằng tôi đang cố gắng bọc bằng SWIG. Dường như họ đang bị quá thông minh bằng một nửa với các chỉ thị tiền xử lý:Lỗi SWIG vì chỉ thị tiền xử lý

// top.h 
#define DECLARE_WITH_COMMA(a) a, 

và sau đó

// foo.h 
#include "top.h" 

#define MY_TYPES(d) \ 
    d(One) \ 
    d(Two) \ 
    d(Three) \ 
    NumElems 

enum MyTypes { 
    MY_TYPES(DECLARE_WITH_COMMA) 
}; 

Đó là tất cả một cách longwinded nói rằng khi tôi cố gắng chạy SWIG (phiên bản 2.0 .4) về "foo.h", tôi nhận được:

foo.h:12: Error: Syntax error in input(1). 

Vì vậy, câu hỏi của tôi là các tùy chọn của tôi ở đây, có thể tôi không muốn thay đổi tiêu đề do nhà cung cấp cung cấp?

+1

Đường 84 nào? Bạn có thể xây dựng một trường hợp thử nghiệm tối thiểu dựa trên các tiêu đề được đề cập và đăng nó ở đây không? –

+0

Ý tưởng hay, sẽ thử. – laslowh

+1

Ok, mã ở trên bây giờ là một trường hợp thử nghiệm hoàn chỉnh. – laslowh

Trả lời

12

SWIG không recurse vào tiêu đề lồng nhau theo mặc định, vì vậy tập tin .i của bạn sẽ giống như:

%module mymod 

%{ 
#include "foo.h" 
%} 

%include "top.h" 
%include "foo.h" 

Ngoài ra còn có một công tắc SWIG:

-includeall  - Follow all #include statements 

nhưng nếu bạn có hệ thống tiêu đề có thể làm nhiều hơn bạn dự định.

+0

cảm ơn, đã làm việc cho tôi! – TimoSolo

+0

Việc thêm phần bổ sung bao gồm làm việc cho tôi – mydogisbox

+0

@MarkTolonen, nếu 'top.h' có câu lệnh' # include' cho một tệp tiêu đề khác thì sao? Tôi đang gặp vấn đề này. Tôi đã thử thêm một '% include' tuyên bố trong tập tin' .i' của tôi nhưng tôi nhận được lỗi cú pháp tương tự. –

Các vấn đề liên quan