go語言-使用swig轉化C++代碼爲go所用

服務端的某個項目,要考慮到性能問題,之前使用基於公司框架的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裏面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章