go语言-使用swig转化C++代码为go所用
2015-04-16 12:54
330 查看
服务端的某个项目,要考虑到性能问题,之前使用基于公司框架的php,性能有瓶颈,经过调研,决定使用go。因为之前有一个关键模块已经使用c++实现,所以计划使用go做HTTP容器,让go和c++模块结合起来。
在网上调研结合方案,go自带的cgo只支持c语言,swig工具可以支持多种语言结合c++,所以决定使用swig,这里简要叙述下swig的使用和一些发现的要点。
1. 我们解压了swig后,首先要根目录运行configure和make,这样会生成各个子目录的makefile,并在当前目录生成preinst-swig.in和swig可执行文件,这些在后续会拥有。
2. 我们进入Example的go里面,这里有一些值得参考的例子
3. 研究那个class例子,有这几个文件:
class.cxx和example.h是我们希望转换的C++代码。
example.i是C++和go的桥梁接口文件,主要是配置。
Makefile会做build工作,其核心其实是调用了Example根目录下那个Makefile。
runme.go是go代码,其中调用了C++代码。
4. 通过阅读Makefile和分析,了解了swig的基本流程:
对C++代码进行编译,生成 .o;
对C++代码根据接口配置文件进行转化,生成.go和go的打包.a文件;
将runme.go和生成的C++的.go文件进行结合,生成可执行文件。
5. 如果要预定义一些map和vector,可以在配置文件里配置一下就可以,这些类型会和C++中的结构、类等均被转化为go中的类型并在C++的.go和.a中存储。一个接口配置文件例子:
6.我们通常会希望将C++代码以go pkg方式呈现,所以可以将生成的.go和.a放到GOPATH中对应地方就好。但是如果要调用这个库生成可执行文件,不能简单的使用go build,而是要使用类似下面的编译方式,这个是从Makefile里面摘出来的:
上面如果不设定GOPATH的路径,会去go的安装目录下面的lib/pkg中找安装包,这不是我们希望的,我们希望所有的包控制在自己的GOPATH里面。
在网上调研结合方案,go自带的cgo只支持c语言,swig工具可以支持多种语言结合c++,所以决定使用swig,这里简要叙述下swig的使用和一些发现的要点。
1. 我们解压了swig后,首先要根目录运行configure和make,这样会生成各个子目录的makefile,并在当前目录生成preinst-swig.in和swig可执行文件,这些在后续会拥有。
2. 我们进入Example的go里面,这里有一些值得参考的例子
3. 研究那个class例子,有这几个文件:
class.cxx和example.h是我们希望转换的C++代码。
example.i是C++和go的桥梁接口文件,主要是配置。
Makefile会做build工作,其核心其实是调用了Example根目录下那个Makefile。
runme.go是go代码,其中调用了C++代码。
4. 通过阅读Makefile和分析,了解了swig的基本流程:
对C++代码进行编译,生成 .o;
对C++代码根据接口配置文件进行转化,生成.go和go的打包.a文件;
将runme.go和生成的C++的.go文件进行结合,生成可执行文件。
5. 如果要预定义一些map和vector,可以在配置文件里配置一下就可以,这些类型会和C++中的结构、类等均被转化为go中的类型并在C++的.go和.a中存储。一个接口配置文件例子:
/* File : example.i */ %module tipcpp %{ #include "example.h" %} %include "std_string.i" %include "std_vector.i" %include "std_map.i" namespace std { %template(AppInfoVector) vector<sAppInfo>; %template(JobDict) map<string, string>; %template(RetMap) map<string, bool>; } /* Let's just grab the original header file here */ %include "example.h"
6.我们通常会希望将C++代码以go pkg方式呈现,所以可以将生成的.go和.a放到GOPATH中对应地方就好。但是如果要调用这个库生成可执行文件,不能简单的使用go build,而是要使用类似下面的编译方式,这个是从Makefile里面摘出来的:
#! /bin/bash go tool 6g -I ${GOPATH}/pkg/linux_amd64/ -pack ${1}.go go tool 6l -L ${GOPATH}/pkg/linux_amd64/ -linkmode external -extld "g++" -extldflags "-I/usr/include " -o $1 ${1}.6
上面如果不设定GOPATH的路径,会去go的安装目录下面的lib/pkg中找安装包,这不是我们希望的,我们希望所有的包控制在自己的GOPATH里面。
相关文章推荐
- 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
- 不用SWIG,Go使用C++代码的方式
- 使用swig工具为go语言与c++进行交互
- 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
- 使用swig将C/C++代码转为JAVA接口(Windows平台)
- Android NDK项目中使用SWIG生成JAVA类和C/C++封装代码
- 使用SWIG实现Python调用C/C++代码
- 使用swig在python中调用c++代码
- go语言笔记——调试还很弱,用gdb来做?可用panic和defer。格式化代码使用gofmt,貌似我的vim插件是自带
- 使用swig从c/c++代码生成java/python/R/php...代码
- 使用SWIG实现C/C++与其他语言间的互相调用 zz
- 使用swig工具为go语言生成调用C、C++代码例子
- 使用swig将C/C++代码转为JAVA接口(Windows平台)
- 使用SWIG实现C/C++与其他语言间的互相调用
- 使用SWIG实现C/C++与其他语言间的互相调用 zz
- go语言使用protobuf与c++做数据通信。
- Android NDK项目中使用SWIG生成JAVA类和C/C++封装代码
- 使用swig将C/C++代码转为JAVA接口(Windows平台)
- Android突破八.使用SWIG将C/C++库移植到其他语言中
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)