SORU
11 Kasım 2009, ÇARŞAMBA


Nasıl C kullanılır?

Go yeni dilde, nasıl C kodu arayayım mı? Diğer bir deyişle, nasıl C derslerimi sarın ve onları kullanmak Gidebilir miyim?

CEVAP
12 Kasım 2009, PERŞEMBE


Güncelleme:Git küçük testi c sınıfı bağlama başardım

C kodu c arayüzü ile sararsan cgo ($GOROOT/mısc/cgo/gmp gmp örnek) ile kütüphane aramak gerekir.

Eğer c sınıfı bir fikri gerçekten miras yok gibi git ifade, olup olmadığından emin değilim.

İşte size bir örnek

C sınıfı olarak tanımlıyorum

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

git kullanmak istiyorum. C arayüzü kullanacağım

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

(Derleyici, Foo boyutunu biliyor bu yüzden c bir yapı yerine void* kullanıyorum)

Uygulamasıdır

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

yapılan tüm bu git dosyadır

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

Bu derlemek için kullanılacak makefile oldu

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

İle test deneyin

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

Yükleyin, çalıştırın yapmak test yapmak ile paylaşılan kitaplığı yüklemeniz gerekir. Beklenen çıktı

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • ThreadBanger

    ThreadBanger

    2 Mart 2007
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006