一. SWIG簡介: SWIG 是Simple Wrapper and Interface Generator的縮寫,是一個幫助使用C或者C++編寫的軟件創(chuàng)建其他編語言的API的工具。例如,我想要為一個C++編寫的程序創(chuàng)建.NET API,一般情況下我必須使用托管C++(Managed C++)去編寫大量的代碼才能生成它的.NET API。有了SWIG,這個機械的工作將變得非常簡單。你只須要使用一個接口文件告訴SWIG要為那些類創(chuàng)建.NET API,SWIG就會自動幫你生成它的.NET API。
當 然,SWIG不僅僅支持創(chuàng)建.NET API。最新版本的SWIG支持常用腳本語言Perl、PHP、Python、Tcl、Ruby和非腳本語言C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是編譯器或者匯編的計劃應用(Guile, MzScheme, Chicken)。
二. 環(huán)境搭建 1. 下載swigwin,在E:/lib目錄下解壓,即把swig安裝到E:/lib/swig目錄中。 2. 新建一個Win32 Console Application,注意在Application Settings中選擇DLL以及空項目。完成后將工程的配置改成release 3. 工具 —> 選項 —> 項目和解決方案 —> VC++目錄 —> 添加E:/lib/swigwin。即把swig添加到VC的可執(zhí)行目錄。
----------------若封裝成Python可用的API,執(zhí)行如下步驟---------------------------- 4. 下載python2.5,安裝到D:/Program Files目錄,并在環(huán)境變量PATH中加入D:/Program Files/python2.5。 5. 把D:/Program Files/python2.5/include加入VC的Include路徑,將D:/Program Files/python2.5/libs加入VC的Library路徑。
-----------------若封裝成Java可用的API,執(zhí)行如下步驟-------------------------------- 6. 下載JDK,安裝到D:/Program Files目錄,并在環(huán)境變量PATH中加入D:/Program Files/Java/jdk1.6.0_10/bin(如果之前安裝過Oracle,要將D:/Program Files/Java/jdk1.6.0_10/bin放在Oracle/jre/1.3.1/bin前面,否則在編譯的時候默認會選擇oracle的 jdk) 7. 把D:/Program Files/Java/jdk1.6.0_10/include/win32 和 D:/Program Files/Java/jdk1.6.0_10/include 加入到加入VC的Include路徑。
三. 接口文件 要在C/C++工程中創(chuàng)建***.i 的接口文件,告訴SWIG要為那些類的那些方法創(chuàng)建API。 接口文件注解: 1. 模塊名由指定的%module來給出(或者用-module命令行選項).這段指示性文字必須寫在文件的頭部并且在使用時將這個模塊名作為擴展模塊對象來 使用(此外,這個模塊名經常在目標語言中被定義成一個命名空間來使用)。如果模塊名在命令行已經被給出了,系統(tǒng)將不考慮由%module標示的模塊名了。 對于python:module的名字指定了生成文件xxx.py的xxx名字, 對于java:module的名字指定了生成文件xxx.java的xxx名字
2. 所有在%{...%}塊內的東西將被簡單作為結果逐字拷貝到SWIG創(chuàng)建的wrapper(包裝)文件中。這部分大部分被用來包括頭文件和生成 wrapper代碼需要的其它聲明。這里很重要的強調一點因為你在一個SWIG的輸入文件中包含了一個聲明,這個聲明并不自動顯示在生成的wrapper 代碼中,因此你需要確信你確實把正確的頭文件在%{ ... %}部分中。這里應該指出SWIG不解析和解釋附在%{ ... %}部分的文字。SWIG的%{...%}內的語法和語義很類似于輸入文件中的聲明部分 。 3. 如果打算為類中所有方法創(chuàng)建API,那么有一個非常簡單的辦法,在接口文件的類聲明部分使用%include標記。SWIG將對%include所指定的文件進行語法分析,類中所有公有方法(Public Method)都將在API中暴露。 /* SwigTest.i */ %module SwigTest %{ #include "SwigTest.h" %} %include “SwigTest.h” //不要和#用混
-------------------------- swig庫模塊訪問部分標準C++庫包括STL的方法------------------- SWIG對于一些語言模塊的支持使較全面的但是對很少用到的庫則支持的很少。
因此,當C / C++代碼中用到這些庫時,可將swig對應的接口文件添加到自己的接口文 件中。如:%include "std_string.i", 庫文件完全識別C++的命名空間。如果你輸出std::string 或 將它重命名為另一種類型。請確認你將此重命名聲明包含到了你的接口文件中。例如: using namespace std;
當 封裝java調用的api且傳遞的參數(shù)中含有中文時,由于c++中的String是使用單字節(jié)編碼,而java中String是使用Unicode編碼, 所以為了傳遞時不出現(xiàn)亂碼,可以包含%include "std_wstring.i",因為wstring使用的是wchar_t類型,這是寬字符,用于滿足非ASCII字符的要求,例如Unicode編 碼。
當封裝python調用的api且傳遞的參數(shù)中含有中文時,就不用考慮這個編碼問題,可以直接使用c++中的String。
四. 編譯模塊
1.寫接口執(zhí)行命令 有 了接口文件以后要對接口文件進行編譯,右鍵點擊接口文件,修改它的屬性,使用自定義編譯工具(Custom Build Tool),命令行(Command Line)內容為swig.exe -c++ -python SwigTest.i ,輸出(Outputs)為$(InputName)_wrapper.cpp;
echo JAVA_INCLUDE: %JAVA_INCLUDE% echo JAVA_BIN: %JAVA_BIN% echo on swig.exe -c++ -python SwigTest.i 命令行參數(shù)說明: ① 為了編譯java 或python模塊,必須包含它們的include和bin目錄,可以在PATH中設置JAVA_INCLUDE、JAVA_BIN、 PYTHON_INCLUDE、PYTHON_BIN等,其中include可以在工程屬性中設置,如果工程屬性中已經設置好,此處不用再包含頭兩句。 ②“ swig.exe ”表示調用你安裝的swig的可執(zhí)行文件,之前已經將其目錄加入到VC的可執(zhí)行目錄中,所以此處就可以不用再寫路徑,否則要找到swig路徑才行。 ③ “-c++” 表示要封裝C++代碼(不寫默認是封裝C代碼), ④“-python”表示要封裝成Python接口(Swig還可以封裝成Java、Ruby等接口), ⑤ “$(InputName)_wrapper.cpp”表示指定要生成的C++代碼文件的名字。
swig的命令還有其他的一些,目前用到的如 –package命令,用法可以為: swig -java -package com.swig -outdir com/swig example.i 在生成java的api時,這個命令使生成的java文件包含在某個包中。
2.編譯(右鍵點擊接口文件—>編譯) 對于生成python可用的API:執(zhí)行上述命令會生成兩個新的文件,一個是SwigTest.py,一個是SwigTest_wrapper.cpp。 對于生成java可用的API:執(zhí)行上述命令會生成Java類文件:SwigTestJNI.java,SwigTest.java 和c文件SwigTest_wrapper.cpp。
3.將xxx_wrapper.cpp加入到工程
4.修改工程屬性: -----------------------封裝java可用的api--------------------- LinkeràGeneralàOutput File改成SwigTest.dll Build EventsàPost-Build EventàCommand Line改成: echo on "%JAVA_BIN%/javac" *.java 這個命令作用是編譯完后調用javac將當前編譯路徑下的所有.java文件編譯成.class二進制文件。 -----------------------封裝python可用的api--------------------- LinkeràGeneralàOutput File改成_SwigTest.pyd(注意一定要有下劃線)
還有一些配置在VC2005里是默認的,但在VC2003里不是的,請引起注意,包括 ① C/C++àCode GenerationàRuntime Library要選擇Multi-threaded DLL (/MD) ② C/C++àLanguageàTreat wchar_t as Built-in Type要選擇yes(如果轉換不涉及wchar等,則無需處理這一項) ③ C/C++àLanguageàEnable Run-Time Type Info要選擇yes
5.生成工程
五.利用生成的api就可以在對應的腳本語言(java、python等)中使用啦。 windows環(huán)境2.0.7版:http://prdownloads./swig/swigwin-2.0.7.zip (###) |
|