如何使用SWIG生成跨平台接口?

时间:2012-05-07 03:59:16

标签: python c gcc swig

我用SWIG包装一个库(Python作为目标)。库函数包含数据类型为“uint32_t”,“uint8_t”等的参数。我想尽可能创建跨平台的接口,因此我想在interface.i文件中使用原始函数签名。例如:

uint32_t func(uint32_t a, uint32_t b);

我试图解决的问题是,除非typedef数据类型上有uint32_t,否则SWIG不会将参数识别为整数。现在我在接口文件上使用它:

typedef unsigned uint32_t;

删除该typedef行将导致该函数无法从目标Python绑定中调用:

>>> mylib.func(2, 2)
TypeError: in method 'func', argument 1 of type 'uint32_t'

我的本​​地计算机上的前一个typedef正常,但在另一个编译器/平台上可能有所不同。使用指令%include "stdint.h"将在SWIG上引发错误:

/usr/include/stdint.h:44: Error: Syntax error in input(1).

由于SWIG不是一个功能齐全的编译器,因此无法完全评估该标头上的所有#ifdef

如何使用编译器在stdint.h标题上选择的数据类型正确提供SWIG?事实上,严格执行正确的数据类型是否有意义,或仅typedef intX_tlong是否正常?

2 个答案:

答案 0 :(得分:12)

如果要在SWIG界面文件中使用这些类型,可以执行以下操作:

%module test
%include "stdint.i"

uint32_t my_function();

现有的SWIG界面对您的系统具有正确的typedef

答案 1 :(得分:0)

你应该强制使用typedef,因为uint32_t不是跨平台而不是交叉编译器。 uint32_t是C99标准,但许多编译器决定不完全实现这个标准。 您可以使用include以交叉编译器的方式重新定义项目类型:

http://www.azillionmonkeys.com/qed/pstdint.h

值得阅读上面链接的标题的介绍。您可以使用此include而不是stdint.h。

你也可以阅读这个问题:

Cross-platform primitive data types in C++