内容是从http://www.swig.org/Doc1.3/SWIG.html#SWIG_nn2上摘抄,是为了理解更深入。
1. 运行swig
在命令行输入:swig [
options] filename
option包括:
-allegrocl Generate ALLEGROCL wrappers
-chicken Generate CHICKEN wrappers
-clisp Generate CLISP wrappers
-cffi Generate CFFI wrappers
-csharp Generate C# wrappers
-guile Generate Guile wrappers
-java Generate Java wrappers
-lua Generate Lua wrappers
-modula3 Generate Modula 3 wrappers
-mzscheme Generate Mzscheme wrappers
-ocaml Generate Ocaml wrappers
-perl Generate Perl wrappers
-php Generate PHP wrappers
-pike Generate Pike wrappers
-python Generate Python wrappers
-r Generate R (aka GNU S) wrappers
-ruby Generate Ruby wrappers
-sexp Generate Lisp S-Expressions wrappers
-tcl Generate Tcl wrappers
-uffi Generate Common Lisp / UFFI wrappers
-xml Generate XML wrappers
-c++ Enable C++ parsing
-Dsymbol Define a preprocessor symbol
-Fstandard Display error/warning messages in commonly used format
-Fmicrosoft Display error/warning messages in Microsoft format
-help Display all options
-Idir Add a directory to the file include path
-lfile Include a SWIG library file.
-module name Set the name of the SWIG module
-o outfile Name of output file
-outcurrentdir
Set default output dir to current dir instead of input file's path
-outdir dir Set language specific files output directory
-swiglib Show location of SWIG library
-version Show SWIG version number
2. swig输入格式
%module mymodule
%{
#include "myheader.h"
%}
int foo;
...
3. SWIG输出
设定swig输出文件格式
$ swig -c++ -python -o example_wrap.cpp example.i
4. 注释
swig曾经将C++注释语句生成文档文件,现在swig在修复这样的功能。
5. C预处理器
swig通过升级的C预处理器进行预处理。swig支持所有标准预处理语句,包括inclusion, conditional, compilation和macro。然而会忽略#include声明语句,除非额外添加--includeall语句,这是因为有时候swig会用于处理原始的C头文件,这时候可能希望只需要头文件中的部分内容而不是全部。
swig会忽略%{...%}块中间的所有的文本内容。
swig预处理器包含了一些宏,使其比C预处理器功能更强大。
6. SWIG指令
swig的指令前通常添加一个%号,这是为了和C语言的命令区分开来。尽管SWIG不是一种C语言的子语言,但是可以在C的头文件中包含swig语句,类似于下面代码
/* header.h --- Some header file */
/* SWIG directives -- only seen if SWIG is running */
#ifdef SWIG
%module foo
#endif
7. 解析器的限值
尽管swig能够解析大多数的C/C++语句,但是并不能解析所有语句,这些语句大多数据非常复杂的类型声明,或C++的一些高级用法。通常下面的语句是不支持的:
- 非标准的类型声明,例如const int extern Number;
- 在C++源文件中运行SWIG
- nested classes
如果遇见不能解析的语句,编译器可能会跳过这段代码。