go语言-使用swig转化C++代码为go所用

本文介绍如何使用SWIG工具将C++代码转化为Go语言可用的形式,包括配置、编译流程及如何在Go中调用C++模块。特别关注于性能优化场景下,Go作为HTTP容器与现有C++模块的结合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

go语言-使用swig转化C++代码为go所用

2015年04月16日 12:54:37 厨房小菜刀 阅读数:1860

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/linux4fun/article/details/45072833

服务端的某个项目,要考虑到性能问题,之前使用基于公司框架的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中存储。一个接口配置文件例子:

/* 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里面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值