How to use C++ in Go?

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Update: I've succeeded in linking a small test c++ class with go

If you wrap you c++ code with a c interface you should be able to call your library with cgo (see the example of gmp in $GOROOT/misc/cgo/gmp).

I'm not sure if the idea of a class in c++ is really expressible in go, as it doesn't have inheritance.

Here's an example

I have a c++ class defined as

// 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;}

which I want to use in go. I'll use the c interface

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

(I use a void* instead of a c struct so the compiler knows the size of Foo)

The implementation is

//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();}

with all that done, the go file is

// 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));}

The makefile I used to compile this was

// 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)

Try testing it with

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

You'll need to install the shared library with make install, then run make test. Expected output is

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.