SWIG是簡單包裝和接口生成器的縮寫,它是一個能用於用於集中語言的工具。一方面,可以通過它使用C語言或者C++編寫擴展代碼;另一方面,它會自動包裝那些代碼,以便能在一些高級語言中使用,例如Tcl Python Perl Ruby java. 這就意味着如果決定將系統的一部分使用C語言擴展編寫,而不是直接在Python中實現的話,那麼C語言擴展庫也能在其他語言中使用。當然需要一些不同語言編寫的子系統協同工作時,這一點就非常有用。C語言擴展在協同工作時會變得很重要。
first step:
一個簡單的C語言程序:
hello.c
#include <stdio.h>
#include <string.h>
int say_hello(void)
{
printf("Hello world!!");
return 0;
}
second step:
編寫接口文件: 接口描述放到文件hello.i中。在很多情況下,如果定義了頭文件,SWIG就可以從頭文件中得到需要的信息。因此如果擁有一個頭文件,可以隨意的使用它。顯示的描寫一個接口文件是因爲可以知道SWIG是怎麼包裝代碼的。最重要的是排除一些東西。比如,如果你要包裝一個巨大的C語音庫,可能需要導出一些function到Python中。在這種情況下,只要把需要導出的函數放到接口文件中就可以了。
接口文件中,就像在一個頭文件中那樣,只需要聲明要導出的函數和變量。頭部的一個單元內,可以指定包含的頭文件以及在這之前的一個%module聲明,即爲模塊定義一個名字。
hello.i
%module hello
%{
#include<string.h>
#include<stdio.h>
%}
extern int say_hello(void);
third step:
輸入:swig -python hello.i
得到兩個新文件:hello_wrap.c 和hello.py
forth step: 編譯、鏈接以及使用
編譯可能是最有技巧的,爲了正確的編譯代碼,需要知道python分佈版的源代碼放在哪。還要根據選擇的C語言編譯器,將代碼鏈接到一個共享庫,指明正確的選項。
我用的是Ubuntu 10.10的系統
eg.
gcc -c hello.c
gcc -I/usr/include/python2.6 -c hello_wrap.c #根據python不同的版本自己選擇文件夾
gcc -shared hello.o hello_wrap.o -o _hello.so
然後打開python
>>> import _hello
>>> dir(_hello)
['SWIG_PyInstanceMethod_New', '__doc__', '__file__', '__name__', '__package__', 'say_hello']
>>>_hello.say_hello()
Hello World!!0
以上完畢。這個就是用SWIG來封裝C語言。