1

C++ ライブラリを Go で記述されたアプリケーション サーバーに接続しようとしています。目標は、C++ ライブラリとアプリケーション サーバーの両方が共通のデータ構造で動作することです。つまり、次のようになります。

  1. Go アプリサーバーは、C++ ライブラリによって作成された配列にアクセスできます。
  2. C++ ライブラリは、Go アプリサーバーによって作成された配列で機能します。

私は cgo を少しいじり、C++ を接続しましたが、これまでのところすべてが機能していました...しかし、データ構造へのポインタの交換に関しては、私は迷っています。私がこれまでに試したこと:

//c++ library header: xyz.h

#include <stdlib.h>

class CppLib {
 public:
  CppLib(unsigned int input);

  int * CreateArray();
};

//C++ library implementation: xyz.cpp
#include "xyz.h"

CppLib::CppLib(unsigned int input) {
    _input = input;
  }

int * CppLib::CreateArray() {
    int values = 5;
    int * myPointer = new int [values];
    for (unsigned i = 0; i < values; ++i) {
        myPointer[i] = i;
    }
    return myPointer;
}

インターフェイスの実装は次のようになります。

//interface.h

int * CCreateArray();

//interface.cc
#include "../lib/xyz.h"

extern "C" {

  int * CCreateArray() {
    CppLib lib(1);
    return lib.CreateArray();
  }
}

最後に、go の実装は次のようになります。

package cgo_lib

// #cgo CFLAGS: -I../lib
// #cgo LDFLAGS: -L../lib -linterfacelib
// #include "interface.h"
import "C"

func GoCreateArray() *int {
    return *int(C.CCreateArray())
}

コンパイルすると、次のエラーが表示されます。

# cgo_lib
../cgo_lib/cgo_lib.go:13: cannot convert _Cfunc_CCreateArray() (type *C.int) to type int
../cgo_lib/cgo_lib.go:13: invalid indirect of int(_Cfunc_CCreateArray()) (type int)

私の質問は、C++ と Go の間でデータ構造へのポインターを交換する方法です。上記では、C++ から GO への道を説明しましたが、逆の方法にも興味があります。

事前にご協力いただきありがとうございます。

4

1 に答える 1