我正在尝试使用其头文件通过SWIG包装DLL。使用SWIG处理我的接口.i文件时出现语法错误。在追踪违规行(SWIG错误消息打印的行号与真正的违规行不匹配)之后,我发现最小的不可处理的SWIG接口文件是:
/* example.i */
%module example
%{
extern __declspec(dllimport) INT __cdecl function(int argument);
%}
extern __declspec(dllimport) INT __cdecl function(int argument);
原型号extern __declspec(dllimport) INT __cdecl function(int argument);
是从我试图包装的头文件中获取的。
使用此类型声明了数十个函数。正如你所看到的,我没有足够的C经验来判断这种类型是否有意义。头文件来自供应商,使用Visual C ++ 6编译好。有人可以澄清一下吗?
答案 0 :(得分:2)
好的......最终了解了调用约定。问题是应该如何编写SWIG接口文件。
/* example.i */
%module example
%{
int __cdecl foo(void); // function declarations for the function
int __stdcall foo2(void); // you intend to wrap goes in here
%}
int foo(void); // function you want to wrap goes in here
int foo2(void); // without the calling convention
在要包装的函数所在的区域中,不应包含调用约定修饰符(__cdecl,__ stdcall等)。但我不想手动删除调用约定修饰符,特别是因为我不想修改我试图包装的头文件(想象一下,供应商发布新的和不兼容的头文件版本,我将不得不修改头文件一遍又一遍)。一个解决方案是#define调用约定修饰符,SWIG已经提供了一个包含这个#define'tions的文件,即“windows.i”。您必须在包含包含要包装的函数的标头之前包含它。像这样:
/* example.i */
%module example
%{
#include "example.h"
%}
%include "windows.i"
%include "example.h"
其中
/* example.h */
int __cdecl foo(void);
int __stdcall foo2(void);
我只是不明白为什么它默认不这样做。但我对我发现的东西很满意。谢谢各位指点......
答案 1 :(得分:1)
只是INT跳出来就像麻烦一样。这是一个宏,你需要#include <windows.h>
来定义它。 非常除了普通的int之外不可能是其他任何东西。 “extern”是多余的,任何编译器都会忽略它。