栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Go中使用C ++

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Go中使用C ++

更新: 我已经成功地将一个小型测试C ++类与Go链接在一起

如果您使用C接口包装C ++代码,则应该可以使用cgo调用您的库(请参阅中的gmp示例

$GOROOT/misc/cgo/gmp
)。

我不确定C ++中的类概念是否真的可以在Go中表达,因为它没有继承。

这是一个例子:

我有一个C ++类定义为:

// foo.hppclass cxxFoo {public:  int a;  cxxFoo(int _a):a(_a){};  ~cxxFoo(){};  void Bar();};// foo.cpp#include <iostream>#include "foo.hpp"voidcxxFoo::Bar(void){  std::cout<<this->a<<std::endl;}

我想在Go中使用。我将使用C接口

// foo.h#ifdef __cplusplusextern "C" {#endif  typedef void* Foo;  Foo FooInit(void);  void FooFree(Foo);  void FooBar(Foo);#ifdef __cplusplus}#endif

(我使用a

void*
而不是C结构,因此编译器知道Foo的大小)

实现是:

//cfoo.cpp#include "foo.hpp"#include "foo.h"Foo FooInit(){  cxxFoo * ret = new cxxFoo(1);  return (void*)ret;}void FooFree(Foo f){  cxxFoo * foo = (cxxFoo*)f;  delete foo;}void FooBar(Foo f){  cxxFoo * foo = (cxxFoo*)f;  foo->Bar();}

完成所有操作后,Go文件为:

// foo.gopackage foo// #include "foo.h"import "C"import "unsafe"type GoFoo struct {     foo C.Foo;}func New()(GoFoo){     var ret GoFoo;     ret.foo = C.FooInit();     return ret;}func (f GoFoo)Free(){     C.FooFree(unsafe.Pointer(f.foo));}func (f GoFoo)Bar(){     C.FooBar(unsafe.Pointer(f.foo));}

我用来编译的makefile是:

// makefileTARG=fooCGOFILES=foo.goinclude $(GOROOT)/src/Make.$(GOARCH)include $(GOROOT)/src/Make.pkgfoo.o:foo.cpp    g++ $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $<cfoo.o:cfoo.cpp    g++ $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $<CGO_LDFLAGS+=-lstdc++$(elem)_foo.so: foo.cgo4.o foo.o cfoo.o    gcc $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS)) -o $@ $^ $(CGO_LDFLAGS)

尝试使用以下方法进行测试:

// foo_test.gopackage fooimport "testing"func TestFoo(t *testing.T){    foo := New();    foo.Bar();    foo.Free();}

您需要使用make install安装共享库,然后运行make test。预期输出为:

gotestrm -f _test/foo.a _gotest_.66g -o _gotest_.6 foo.cgo1.go foo.cgo2.go foo_test.gorm -f _test/foo.agopack grc _test/foo.a _gotest_.6  foo.cgo3.61PASS


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号