2012-05-25 3 views
12

У нас есть поставщик, который предоставил нам библиотеку и заголовки C++, которые я пытаюсь обернуть с помощью SWIG. Оказывается, что они слишком умны наполовину с директивами препроцессора:Ошибки SWIG из-за директивы препроцессора

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

, а затем

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

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

enum MyTypes { 
    MY_TYPES(DECLARE_WITH_COMMA) 
}; 

Что это все longwinded способ сказать, что, когда я пытаюсь запустить SWIG (версия 2.0 +0,4) на «foo.h», я получаю:

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

Так что мой вопрос, каковы мои вариантов здесь, учитывая, что я, вероятно, не хочу, чтобы изменить установленный производитель заголовки?

+1

Что такое линия 84? Можете ли вы построить минимальный тестовый сценарий на основе заголовков, о которых идет речь, и разместить его здесь? –

+0

Хорошо, попробуй. – laslowh

+1

Хорошо, код выше теперь представляет собой полный тестовый пример. – laslowh

ответ

12

SWIG не рекурсию на вложенные заголовки по умолчанию, так что ваш файл .i должен выглядеть примерно так:

%module mymod 

%{ 
#include "foo.h" 
%} 

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

Существует также SWIG переключатель:

-includeall  - Follow all #include statements 

, но если у вас есть система которые могут сделать больше, чем вы планируете.

+0

спасибо, работал на меня! – TimoSolo

+0

Добавление дополнительных включений сработало для меня – mydogisbox

+0

@MarkTolonen, что, если 'top.h' имеет оператор' # include' для другого файла заголовка? У меня проблема. Я попытался добавить оператор '% include' в свой файл' .i', но я получаю ту же синтаксическую ошибку. –

Смежные вопросы