使用swig工具为go语言生成调用C、C++代码例子

qinhui99 · · 3967 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

swig开源项目(http://www.swig.org)为多种编程语言提供了相互访问的接口生成工具,这里面也包含了为go语言生成调用C、C++代码的功能。Go语言自带的cgo工具已经支持对C代码的调用,但对C++代码的支持确实不行,所以Go1已经把swig的C++这部分功能作为附带功能加入(参见Go源代码\go\misc\swig)。这样,C++这块的资源也可以被Go语言使用了。


1、为Go语言生成调用C语言的接口:

根据swig的相关文档指导( http://www.swig.org/Doc2.0/Go.html#Go ),用swig自带的例子做测试。以下的例子都是在ubuntu12.04下测试完成的。例子来源\swigwin-2.0.7\Examples\go\simple

swig -go example.i
gcc -c -fpic example.c
gcc -c -fpic example_wrap.c
gcc -shared example.o example_wrap.o -o example.so
go tool 8g example.go

go tool 8c example_gc.c 
这里会报错,

example_gc.c:14 8c: No such file or directory: runtime.h 

After reading golang-nuts thread:
原来是没有设置3个环境变量:
 GOROOT、 GOARCH和 GOOS。这里临时在控制台设置:

export GOROOT=/usr/lib/go
export GOARCH=386

export GOOS=linux

go tool 8c -I ${GOROOT}/pkg/${GOOS}_${GOARCH}  example_gc.c

go tool pack grc example.a example.8 example_gc.8

go tool 8g runme.go

go tool 8l -o runme runme.8
//为了运行runme,还需要export 
LD_LIBRARY_PATH

export LD_LIBRARY_PATH=${pwd}:${LD_LIBRARY_PATH}

./runme

 这样应该能看到运行结果了

2、为go语言生成调用C++语言的接口:

例子来源\swigwin-2.0.7\Examples\go\class

swig -c++ -go example.i

g++ -g -c -fpic   example.cxx example_wrap.cxx 

g++ -shared    example.o example_wrap.o   -o example.so

go tool 8g example.go

export GOROOT=/usr/lib/go
export GOARCH=386
export GOOS=linux

go tool 8c -I ${GOROOT}/pkg/${GOOS}_${GOARCH}  example_gc.c

go tool pack  grc example.a example.8 example_gc.8

go tool 8g runme.go

go tool 8l -o runme runme.8

 //为了运行runme,还需要export LD_LIBRARY_PATH

export LD_LIBRARY_PATH=${pwd}:${LD_LIBRARY_PATH}

 ./runme


最后,泼点冷水。调用C或者C++本地代码,确实能满足性能要求比较高的需求。但要记住,它是一把双刃剑。它会让你的解决方案更加复杂,需要花费更多的时间和精力去开发和维护。要不要使用它,只能靠你自己去衡量。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:qinhui99

查看原文:使用swig工具为go语言生成调用C、C++代码例子

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3967 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传