SWIG: 為你最喜愛的 scripting 語言外掛模組


我們喜歡用 perl, tcl, python 等等 scripting languages 來解決日常遇到的問題, 因為用這些語言寫程式比較快 (節省程式設計師的時間); 另一方面, C 與 C++ 這類低階語言則有 (1) 執行速度快 (2) 既有的程式庫豐富 這兩個優點. 魚與熊掌, 可否兼得呢?

SWIG (Simplified Wrapper and Interface Generator) 可以讓我們把既有的或自己寫的 C/C++ 副程式庫很容易地變成這些 scripting languages 的外掛模組.

以下以 CLE 0.8 為例, 說明如何上手及會遇到那些問題:

  1. 照著手冊 Introduction 一文當中的範例做.
  2. 不論是製作 tcl, perl, 或 python 的模組, 都可以用下列的命令:
            swig -lang example.i
            gcc -c -fpic example.c example_wrap.c -Iinclude_path
            gcc -shared example.o example_wrap.o -o example.so
        
    
    其中 lang 為 tcl8, perl5, 或 python; 而 include_path 則視該語言的 header files 的安裝路徑而定. 可以用 rpm -ql perl 或 rpm -ql python-devel 來查.
  3. 編譯 perl 模組時, 可能會出現很多錯誤訊息. 我的解決方式: 在 example_wrap.c 的最上面加上一句: typedef int bool;

撰寫 C 函式庫的注意事項

  1. 字元, 整數, 浮點數的轉換都很直覺.
  2. 字串參數最好都是 char const * 也就是說你的 C 函數應該只讀出不寫入它的字串參數.
  3. Swig 遇到指標就直接傳, 不去打開裡面來看.
  4. 複雜的東西都用指標傳入傳出.
  5. 可在 .i 檔內加上 %init ... 做一些初始設定.
  6. 如果要傳入/傳出結構, 可以考慮用簡單的 typemap