Причина, по которой SWIG не работает, заключается в том, что он обычно не рекурсирует во включаемые файлы, когда вы %include
файл оборачиваете его интерфейс, поэтому определения, определенные в <machine/endian.h>
, не обрабатываются.
ТамЕсть несколько вариантов, чтобы исправить это:
Используйте -cpperraswarn
и игнорируйте ошибку, как предложено.SWIG обрабатывает #if неправильно, но компилятор значения .SWIG по-прежнему будет выставлять значения HIOFFSET
и LOWOFFSET
в оболочке, и это значение будет правильным.
%include <machine/endian.h>
в явном виде.Это может или не может работать правильно, в зависимости от содержимого файла, и может предоставить больше переменных в оболочке SWIG, чем предполагалось.
Использование -includeall
с SWIG для явной рекурсии во все#include файлы.Обычно это не требуется, поскольку SWIG попытается обернуть все определения.Например, вы получите все в #include <stdio.h>
, если оно есть.
Явно определите BYTE_ORDER
и / или LITTLE_ENDIAN
в SWI-файле .i, чтобы обойти проблему.
Вот несколько примеров:
- cpperraswarn Решение:
test.i
%module test
%{
#include "test.h"
%}
%include "test.h"
SWIG генерируетwraning, и в результате определены только HIOFFSET
и LOWOFFSET
, но они верны для моей машины с прямым порядком байтов даже при ошибке SWIG.Компилятор все еще правильно обработал определение.
>>> import test
>>> dir(test)
['HIOFFSET', 'LOWOFFSET', 'SWIG_PyInstanceMethod_New', '__builtin__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic', '_swig_setattr_nondynamic_method', '_test']
>>> test.HIOFFSET
1
% include endian.h Решение:
В этом случае у меня машина Windows, поэтому я смоделировал проблему, создав файл msvc_endian.h
и определения в нем BYTE_ORDER
и LITTLE_ENDIAN
.
test.h был изменен для использования следующего фрагмента:
#ifdef _MSC_VER
#include "msvc_endian.h"
#endif
test.i явно обработал заголовок:
%module test
%{
#include "test.h"
%}
%include "msvc_endian.h"
%include "test.h"
msvc_endian.h
#define LITTLE_ENDIAN 0x0001
#define BYTE_ORDER LITTLE_ENDIAN
SWIG теперь не имеет предупреждения, и результат по-прежнему корректен, но из-заобработка подзаголовка LITTLE_ENDIAN
и BYTE_ORDER
также были выставлены как значения в оболочке:
>>> import test
>>> dir(test)
['BYTE_ORDER', 'HIOFFSET', 'LITTLE_ENDIAN', 'LOWOFFSET', 'SWIG_PyInstanceMethod_New', '__builtin__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic', '_swig_setattr_nondynamic_method', '_test']
>>> test.HIOFFSET
1