这是我要生成SWIG绑定的C ++代码中的预处理器部分。
#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) \
|| defined(__OpenBSD__)
#include <machine/endian.h>
#endif
#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || \
defined(ANDROID)
#include <endian.h>
#endif
#ifdef __MINGW32__
#include <sys/param.h>
#endif
#ifdef _MSC_VER
/* _MSVC lacks BYTE_ORDER and LITTLE_ENDIAN */
#define LITTLE_ENDIAN 0x0001
#define BYTE_ORDER LITTLE_ENDIAN
#endif
#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN)
#error No byte order defined
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
# define HIOFFSET 1
# define LOWOFFSET 0
#else
# define HIOFFSET 0 /* word offset to find MSB */
# define LOWOFFSET 1 /* word offset to find LSB */
#endif
但是当我尝试使用swig
命令生成SWIG绑定时,出现以下错误:
错误:CPP#错误“未定义字节顺序”。使用-cpperraswarn 选择继续进行swig处理。
似乎SWIG尝试生成绑定时,由于某些原因未包含<machine/endian.h>
。
如何解决此错误?我是否需要在SWIG接口文件中添加任何内容?
我正在使用macOS 10.14.4。
添加:这是我的SWIG界面文件的样子。
%module pd
%{
#include "myBindings.h"
%}
%include "myBindings.h"
如您所见,其中没有什么特别之处。
然后使用以下命令生成绑定:
swig -c++ -lua -fcompact -fvirtual -I../../../libs/openFrameworks myBindings.i && mv myBindings_wrap.cxx myBindings.cpp
然后我得到上述错误。
即使我刚刚离开#include <machine/endian.h>
,它仍然会产生相同的错误。 (No byte order defined
)
答案 0 :(得分:1)
SWIG失败的原因是,当您%include
包装文件的接口时,SWIG通常不会递归到包含文件中,因此不会处理<machine/endian.h>
中定义的定义。
有很多方法可以解决此问题:
使用-cpperraswarn
并忽略建议的错误。 SWIG将错误地处理#if,但由编译器构建该值。 SWIG仍将在包装器中公开HIOFFSET
和LOWOFFSET
值,并且这些值将是正确的。
%include <machine/endian.h>
明确。根据文件的内容,这可能会或可能无法正常工作,并且可能会在SWIG包装器中公开比预期更多的变量。
将-includeall
与SWIG一起使用可显式递归到所有#include文件中。通常不希望这样做,因为SWIG会尝试包装所有定义。例如,如果存在,您将在#include <stdio.h>
中获得所有内容。
在SWIG .i文件中明确定义BYTE_ORDER
和/或LITTLE_ENDIAN
,以解决此问题。
这里有几个例子:
%module test
%{
#include "test.h"
%}
%include "test.h"
SWIG生成争用,结果仅定义了HIOFFSET
和LOWOFFSET
,但是即使SWIG错误,它们对于我的Little-endian机器也是正确的。编译器仍然正确地处理了定义。
>>> 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
在这种情况下,我有一台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