How do you golang use c or c++ code?



  • Please provide a simple example of the use of the function from \c+++ in the golang programme. For example, c/ c++ will sayHello return value -

    "Hi, Roman, this is a function."


    That's what I want in the golang program. How do you do that?
    Please provide examples. Thank you.



  • Explain the class.

    // foo.hpp
    class cxxFoo {
    public:
      int a;
      cxxFoo(int _a):a(_a){};
      ~cxxFoo(){};
      void Bar();
    };
    

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

    Interface C

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

    Implementation

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

    package 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

    // makefile
    TARG=foo
    CGOFILES=foo.go
    include $(GOROOT)/src/Make.$(GOARCH)
    include $(GOROOT)/src/Make.pkg
    foo.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)

    Testing

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

    Library installation

    gotest
    rm -f _test/foo.a gotest.6
    6g -o gotest.6 foo.cgo1.go foo.cgo2.go foo_test.go
    rm -f _test/foo.a
    gopack grc _test/foo.a gotest.6 foo.cgo3.6
    1
    PASS




Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2