C++ ライブラリを Go で記述されたアプリケーション サーバーに接続しようとしています。目標は、C++ ライブラリとアプリケーション サーバーの両方が共通のデータ構造で動作することです。つまり、次のようになります。
- Go アプリサーバーは、C++ ライブラリによって作成された配列にアクセスできます。
- 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 への道を説明しましたが、逆の方法にも興味があります。
事前にご協力いただきありがとうございます。