首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成SWIG绑定时不能包含<endian.h>

生成SWIG绑定时不能包含<endian.h>
EN

Stack Overflow用户
提问于 2019-05-30 14:02:50
回答 1查看 355关注 0票数 1

下面是我的C++代码中的预处理器部分,我希望生成SWIG绑定。

代码语言:javascript
复制
#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>没有被包括在内。

如何修复此错误?

我使用的是macOS 10.14.4。

代码语言:javascript
复制
%module pd
%{
    #include "myBindings.h"
%}
%include "myBindings.h"

我使用以下命令生成绑定:

代码语言:javascript
复制
swig -c++ -lua -fcompact -fvirtual -I../../../libs/openFrameworks myBindings.i && mv myBindings_wrap.cxx myBindings.cpp

然后我得到了上面提到的错误。(No byte order defined)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 00:20:52

<machine/endian.h>失败的原因是,当你包装一个文件来包装它的接口时,它通常不会递归到包含文件中,所以SWIG中定义的定义不会被处理。

有许多选项可以解决此问题:

  1. 使用-cpperraswarn并按照建议忽略错误。这通常是不需要的,因为SWIG将尝试包装所有定义。例如,如果present.
  2. Explicitly在SWIG .i文件中定义BYTE_ORDER和/或LITTLE_ENDIAN来解决此问题,您将获得#include <stdio.h>中的所有内容。

这里有几个例子:

--cpperraswarn解决方案:

test.i

代码语言:javascript
复制
%module test

%{
#include "test.h"
%}

%include "test.h"

SWIG生成警告,结果是只定义了HIOFFSETLOWOFFSET,但它们对于我的小端机器是正确的,即使有来自SWIG的错误。编译器仍然正确地处理了定义。

代码语言:javascript
复制
>>> 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

test.h已修改为使用以下代码段:

代码语言:javascript
复制
#ifdef _MSC_VER
#include "msvc_endian.h"
#endif

test.i显式处理了报头:

代码语言:javascript
复制
%module test

%{
#include "test.h"
%}

%include "msvc_endian.h"
%include "test.h"

msvc_endian.h

代码语言:javascript
复制
#define LITTLE_ENDIAN 0x0001
#define BYTE_ORDER LITTLE_ENDIAN

SWIG现在没有警告,结果仍然正确,但由于处理过程,子头LITTLE_ENDIANBYTE_ORDER也在包装器中公开为值:

代码语言:javascript
复制
>>> 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56372488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档