C
和 C++
被公认为(理当如此)创建高性能代码的首选平台。对开发人员的一个常见要求是向脚本语言接口公开 C/C++
代码,这正是 Simplified Wrapper and Interface Generator (SWIG) 的用武之地。SWIG 允许您向广泛的脚本语言公开 C/C++
代码,包括 Ruby、Perl、Tcl 和 Python。本文使用 Ruby 作为公开 C/C++
功能的首选脚本接口。要理解本文,您必须具备 C/C++
与 Ruby 方面的相应知识。
SWIG 是一款不错的工具,可适合多种场景,其中包括:
- 向
C/C++
代码提供一个脚本接口,使用户更容易使用 - 向您的 Ruby 代码添加扩展或将现有的模块替换为高性能的替代模块
- 提供使用脚本环境对代码执行单元和集成测试的能力
- 使用 TK 开发一个图形用户接口并将它与
C/C++
后端集成
此外,与 GNU Debugger 每次都需触发相比,SWIG 要容易调试得多。
使用 SWIG 编写 Hello World
作为输入,SWIG 需要一个包含 ANSI C/C++
声明和 SWIG 指令的文件。我将此输入文件称为 SWIG 接口文件。一定要记住,SWIG 仅需要足够生成包装器代码的信息。该接口文件通常具有 *.i 或 *.swg 扩展名。以下是第一个扩展文件 test.i:
1
2
|
%module test %constant char* Text = "Hello World with SWIG" |
使用 SWIG 运行此代码:
1
|
swig –ruby test.i |
第二个代码段中的命令行在当前文件夹中生成一个名为 test_wrap.c 的文件。现在,您需要在此 C
文件中创建一个共享库。以下是该命令行:
1
2
|
bash$ gcc –fPIC –c test_wrap.c –I$RUBY_INCLUDE bash$ gcc –shared test_wrap.o –o test_wrap.so –lruby –L$RUBY_LIB |
就这么简单。您已准备就绪,那就触发交互式 Ruby shell (IRB),输入 require 'test_wrap'
来检查 Ruby Test
模块和它的内容。以下是扩展的 Ruby 端:
1
2
3
4
5
6
|
irb(main):001:0> require 'test_wrap' => true irb(main):002:0> Test.constants => ["Text"] irb(main):003:0> Test:: Text => "Hello World with SWIG" |
SWIG 可用于生成各种语言扩展,只需运行 swig –help
检查所有的可用选项。对于 Ruby,可以输入 swig –ruby <interface file>
;对于 Perl,可以使用 swig –perl <interface file>
。
也可以使用 SWIG 生成 C++
代码:只需在命令行使用 –c++
即可。在前面的示例中,运行 swig –c++ –ruby test.i
会在当前文件夹中生成一个名为 test_wrap.cxx 的文件。
参考文档:https://www.ibm.com/developerworks/cn/aix/library/au-swig/