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(<ime);
return ctime(<ime);
}
现在,为了将这些文件添加到您喜欢的语言中,您需要编写一个.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文件
如果构建一个其他语言模块,其他语言的命令行可以通过swig help查看,也可以查看官方文档,还可以查看下载的github源码Doc目录。