当前位置: 首页 > 工具软件 > SWIG > 使用案例 >

SWIG系列

富勇军
2023-12-01

SWIG 基本概念和入门

  • C/C++公认为创建高性能代码首选平台
  • 向脚本语言接口公开C/C++代码
    • Simplified Wrapper and Interface Generator的用武之地
  • SWIG允许您向脚本语言公开 C/C++ 代码
    • 包括 Ruby、Perl、Tcl 和 Python
  • 本文用 Ruby 作为公开 C/C++ 功能的首选脚本接口。
  • 要理解本文,您必须具备 C/C++ 与 Ruby的相应知识

这个貌似是在Ruby中调用C++呀!

  • SWIG

  • 一款不错工具,适合多种场景

    • 包括:向 C/C++ 代码提供一个脚本接口,
    • 使用户更易用
    • 向Ruby代码添加扩展或将现有的模块替换为高性能的替代模块
  • 提供使用脚本环境对代码执行单元和集成测试的能力

  • 用TK 开发一个图形用户接口并将它与 C/C++ 后端集成

  • 与 GNU Debugger 每次都需触发相比,SWIG易调试多

用SWIG编写 Hello World

  • 作为输入,SWIG需一个含 ANSI C/C++ 声明和 SWIG 指令的文件
  • 我将此输入文件称为 SWIG 接口文件
  • SWIG 仅需要足够生成包装器代码的信息。
  • 该接口文件常具有 *.i 或 *.swg
  • 第一个扩展文件 test.i:
%module test
%constant char* Text = "Hello World with SWIG"

  • 用SWIG 运行此代码
swig –ruby test.i
  • 当前文件夹生成test_wrap.c。
  • 现在需在此 C 文件中创建一个共享库
gcc –fPIC –c test_wrap.c –I$RUBY_INCLUDE
gcc –shared test_wrap.o –o test_wrap.so –lruby –L$RUBY_LIB

  • 您已准备就绪,那就触发交互式 Ruby shell (IRB),
  • 输入 require ‘test_wrap’ 来检查 Ruby Test 模块和它的内容。以下是扩展的 Ruby 端:
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 ;
  • Perl,swig –perl 。
  • 也可以用 SWIG 生成 C++ 代码:只需在命令行使用 –c++
  • 前面示例中,swig –c++ –ruby test.i
    • 会在当前文件夹中生成一个名为 test_wrap.cxx

canci

swig安装搭建与测试

swig是什么?

  • 软件工具
  • 能让一些脚本语言调C/C++接口
  • 实现的方法,
    • 通过编译程序将C/C++的声明文件(.i文件)
    • 编译成C/C++的包装器源代码(.c或.cxx)。
    • 直接调这样的包装器接口,脚本语言可间接调用C/C++程序接口。

就是让脚本语言调用这个C/C++吧!

  • SWIG支持:Perl, Python, Tcl, Ruby, Guile, and Java
  • 用SWIG通常不需修改被包装的源程序代码,
    • 几分钟就能生成
    • 你所需要的包装器源代码文件
  • SWIG使用场景:
  • 1 将C语言的程序包装成解释性语言的接口;
  • 2 快速原型开发 ;
  • 3 可交互式的DEBUG ;
  • 4 将代码重构成脚本语言。

swig安装

  • linux下简单。
  • 源码安装
  • http://www.swig.org/download.html上下载。
  • 安装的老三步:configure;make;make install

测试

  • 假设你有一些c
  • 想再加入Tcl, Perl, Python, Java and C#.。
  • example.c
 /* File : example.c */
 
 #include <time.h>
 double My_variable = 3.0;
 
 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }
 
 int my_mod(int x, int y) {
     return (x%y);
 }
 	
 char *get_time()
 {
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
 }

  • 为增加这些文件到你喜欢的语言中,
  • 你需写一个接口文件(interface file)投入到swig。
  • 这些C functions的接口文件可能如下所示:
/* example.i */
 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}
 
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();

建立Python模块

转换编码C成Python模块很简单,只需要按如下做即可(请见其他操作系统的SWIG共享库帮助手册):

unix % swig -python example.i
unix % gcc -c example.c example_wrap.c
-I/usr/local/include/python2.1
unix % gcc -shared example.o example_wrap.o -o _example.so

我们现在可以使用如下Python模块 :

 import example
 example.fact(5)
 120
 example.my_mod(7,3)
 1
example.get_time()
 Sun Feb 11 23:01:07 1996'

canci

 类似资料: