swig安装与使用

5,264 阅读3分钟

1.简介

SWIG 是一种软件开发工具,它将用 C 和 C++ 编写的程序与各种高级编程语言连接起来。 SWIG 与不同类型的目标语言一起使用,包括常见的脚本语言,例如 Javascript、Perl、PHP、Python、Tcl 和 Ruby。支持的语言 列表  还包括非脚本语言,如 C#、D、Go 语言,Java 包括 Android、Lua、OCaml、Octave、Scilab 和 R。还支持几种解释和编译的 Scheme 实现(Guile、MzScheme/Racket)。 SWIG 最常用于创建高级解释或编译的编程环境、用户界面,以及作为测试和原型 C/C++ 软件的工具。 SWIG 通常用于解析 C/C++ 接口并生成上述目标语言调用 C/C++ 代码所需的“粘合代码”。 SWIG 还可以以 XML 的形式导出其解析树。

2.安装swig

如果你不需要swig支持Objective-c语言,可以直接通过brew install swig进行安装

但是如果需要支持Ojective-C语言,那么你就需要在github上面下载一个支持Ojective_C版本进行编译安装。

2.1 前期准备

  • MacOS系统
  • Git 或 Subversion
  • Autoconf 2.58 或更高版本
  • Automake 1.7.2 或更高版本
  • 一个有效的 C 和 C++ 编译器。
  • yacc 或 bison(编译 SWIG 解析器)。
  • libpcre(正则表达式库依赖项)

2.1.1 安装autoconf

方式一
curl -OL http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar -xzf autoconf-2.69.tar.gz 
cd autoconf-2.69
./configure && make && sudo make install
 
方式二

前提是安装了homebrew

brew install autoconf 

2.1.2 安装automake

方式一
### 开始安装swig


curl -OL http://ftp.gnu.org/gnu/automake/automake-1.16.1.tar.gz
tar -xzf automake-1.16.1.tar.gz
cd automake-1.16.1
./configure && make && sudo make install

方式二

前提是安装了homebrew

brew install automake 

一个有效的 C 和 C++ 编译器 使用clang libpcre macos系统自带

2.1.3 安装bison

brew install bison

2.2 开始安装swig

  • 1.下载代码
  • 2.进入swig-objc或者swig目录,执行下面命令行
./autogen.sh
./configure
make
make install

默认情况下,SWIG 将自身安装在 /usr/local 中,但是我们可以通过 ./configure --prefix=/home/yourname/projects 去设置安装目录

3. 开始使用

为了说明 SWIG 的使用,假设您想将一些 C 函数添加到 Tcl、Perl、Python、Java 和 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);
 }
 

现在,为了将这些文件添加到您喜欢的语言中,您需要编写一个.i格式的“接口文件”,它是 SWIG 的输入。这些 C 函数的接口文件可能如下所示:

 /* example.i */
 %module example
 %{
 /*将头文件或函数声明放在这里,如下所示 */
 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();

其他语言格式的模板可以从官网文档查询

3.1 构建Objective-C模块

通过命令行去构建Objective-C模块

swig -c++ -objc example.i

这将创建两个不同的 Objective-C++ 文件及其相关的头文件; 一个包装源文件 example_wrap.mm 和一个代理源文件 example_proxy.mm。 生成的包装器包含需要编译并与 C/C++ 应用程序的其余部分链接以创建扩展模块的低级 C 函数。 代理源文件包含高级语言支持代码,这是您将导入以使用模块的文件。

包装器/代理文件的名称源自模块名称,用 %module 指定。 例如,如果模块名称为 example,则包装文件的名称为 example_wrap.mm,代理文件为 example_proxy.mm。

可以通过下面的命令行查看构建Objectvie更多的命令选项

swig -objc -help 

3.2 编译动态模块

Objective-C++代码可以存在于静态库或动态库中。假设您需要在一个名为example的文件中链接代码。Cxx,为了构建一个动态库文件,你需要以类似于下面的方式编译你的模块:

$ swig -c++ -objc example.i
$ g++ -g -c example_wrap.mm example_proxy.mm example.cxx
$ g++ example_wrap.o example_proxy.o example.o -dynamiclib -framework Foundation -o libexample.dylib

如果使用的是window或者其他平台安装,可以查看源码中的Preface.html文件

image.png 如果构建一个其他语言模块,其他语言的命令行可以通过swig help查看,也可以查看官方文档,还可以查看下载的github源码Doc目录。

image.png

swig官网地址