在SWIG官網上的教程:
In Developer Studio, SWIG should be invoked as a custom build option.
This is usually done as follows:
- Open up a new workspace and use the AppWizard to select a DLL
project.
- Add both the SWIG interface file (the .i file), any supporting C
files, and the name of the wrapper file that will be created by SWIG
(ie. example_wrap.c). Note : If using C++, choose a
different suffix for the wrapper file such as
example_wrap.cxx. Don't worry if the wrapper file doesn't
exist yet--Developer Studio keeps a reference to it.
- Select the SWIG interface file and go to the settings menu. Under
settings, select the "Custom Build" option.
- Enter "SWIG" in the description field.
- Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
- Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
- Next, select the settings for the entire project and go to
"C++:Preprocessor". Add the include directories for your Python
installation under "Additional include directories".
- Define the symbol __WIN32__ under preprocessor options.
- Finally, select the settings for the entire project and go to
"Link Options". Add the Python library file to your link libraries.
For example "python21.lib". Also, set the name of the output file to
match the name of your Python module, ie. _example.pyd - Note that _example.dll also worked with Python-2.4 and earlier.
- Build your project.
在DS中,SWIG需要被匯入到custom build option中,通常採用下面的方式
1、開啟新的workspace,使用AppWizard想到選擇一個Dll工程
2、把SWIG介面檔案(.i檔案),任何支援的C檔案,以及封裝的檔案名稱(由SWIG建立,例如example_wrap.c)。注意:如果使用C++,為封裝檔案選擇不同的尾碼名,如example_wrap.cxx,不要擔心,如果wrapper檔案不存在,DS保持對他的引用。
3、選擇SWIG介面檔案(.i),進入settings菜單(右鍵-settings),在settings中,選擇“Custom Build”選項
4、在Description Field(描述域)中輸入SWIG
5、在“Build command(s) field”(構建命名域)中輸入"swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)"
6、選擇整個工程的settings(project-settings),進入C++:Preprocessor選項中,在Additional include directories中輸入Python安裝的目錄中的include(其實不必這樣設定,可以在整個vs環境中就將Python的include環境配置進去。如何配置整個include環境,見下面後注。
7、定義在預先處理選項上定義__WIN32__宏
8、最後,選擇整個工程的settings,進入Link Options,添加Python庫檔案到連結檔案中,例如"python21.lib"(現在一般都用python25.lib,在python安裝目錄下的libs中),同時,設定輸出檔案名為Python模組支援的方式,如_example.pyd——注意_example.dll在Python2.4和之前版本均支援。
8、建立project
後註:
如果你一老一實的那麼做,你很有可能會失敗,主要失敗點在:
1、Python的library庫沒有匯入:最佳的做法是在tool-options-directory中添加include檔案和library檔案
2、如果你把swig的執行目錄也放在上面的directory中,也有可能會失敗,我就是因為這個,導致很久都沒有運行,建議放在環境變數的path目錄下面
3、建議你在第一次構建的時候不要匯入封裝的檔案名稱,第一次構建完畢後,會在目前的目錄下(依據你的配置),產生一個封裝檔案名稱,這個時候,你在匯入封裝檔案名稱,可以省去封裝名錯誤的問題!然後再編譯一下就完成了封裝
4、Python安裝目錄下的libs只有PythonXX.lib,支援的是Release版本的PythonXX.dll,因此,最好是採用Release版本來編譯,這樣在運行時就不會有錯誤。
5、注意,配置工程文檔時要注意debug與Release都需要配置,否則,也有可能出現錯誤
swig是一個不錯的工具,用來封裝C/C++編寫的代碼到其他程式中,非常不錯!
對於C編譯器,上面的方法毫無問題,但是對於VC6.0下面使用C++來匯出函數使用的時候,將會出現很多問題,尤其是與extern "C" __declspec (dllimport)和__stdcall 支援時候的庫匯出時,將會遇到很多問題。
下面是一個解決方案:
1、將__declspec(dllimport) 和__stdcall 定義的宏屏蔽掉,如已經存在:
#define DLLIMPORT __declspec(dllimport)
#define WINAPI __stdcall
這個時候,如果直接使用swig,那麼將會出現錯誤。因為swig支援的是ANSI C/C++,對於這些在Windows下的擴充是不支援的,將上面語句注釋掉,然後建立兩個空宏
#define DLLIMPORT
#define WINAPI
注意,如果是系統定義的,如WINAPI,CALLBACK,可以先將這些宏申明去除,在重新定義
#undef WINAPI
#define WINAPI
2、編寫interface檔案,將正確的interface檔案編譯後,會出現link錯誤,這是正常的,因為前面已經屏蔽了。
3、要感謝make的作用,這個時候,你修改匯入庫的其他函數,介面檔案不會再次被編譯,也就是不錯再次產生封裝包的檔案(cpp檔案),於是再將匯入庫中的函數調用方式修改回來
4、再次編譯,你將獲得正確的編譯結果,需要注意的是,如果你修改了interface檔案,那麼就一定要把宏重新屏蔽掉,否則仍舊會有錯誤存在,只有當你確認沒有錯誤的時候,才可以使用最初定義的匯出,匯出方式。
此方法對C編譯器(MSVC)無用!反而會出現大量錯誤!!!
make fun!
如一個執行個體為:
swig.i檔案:
%module opencv
%include cxcore.i
%include cv.i
cxcore.i檔案為:
%{
#include <cxcore.h>
%}
%include "cxcore.h"
cv.i檔案為:
%{
#include <cv.h>
%}
%include "cv.h"
但要注意的是,cxcore檔案中的一些函數指標需要通過另外的方式解決,swig無法識別這些函數內容