1

我正在尝试将 C++ 库连接到用 Go 编写的应用服务器。目标是 C++ 库和 appserver 都在使用一个通用的数据结构,这意味着:

  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

1

这里:

return *int(C.CCreateArray())

可以写成

return *((int)(C.CCreateArray()))

您取消引用 an int,这会导致:

invalid indirect of int(_Cfunc_CCreateArray()) (type int)

在该声明中,仅观察这一部分:

(int)(C.CCreateArray())

您正在尝试将 an 转换*C.int为 an int,这不起作用,因为第一个是指针,第二个不是。

除此之外,还有@tadman 在您的问题评论中提到的内存管理问题,Go 并不像 C 那样将数组表示为指向其第一个元素的指针。

如果你想分享ints ,你必须具体说明它们的宽度:intGo 中的 an 有一个依赖于拱门的宽度,还有一个 C int

阅读有关 CGO 的更多信息:http: //golang.org/cmd/cgo/

一旦你解决了所有这些问题,你将不得不继续这样的事情:

s := make([]int32, 0, 0)

h := (*reflect.SliceHeader)((unsafe.Pointer)(&s))

h.Data, h.Len, h.Cap = P, L, L // see below

s = *(*[]int32)(h)

哪里P是你的数组的 Go uintptr,它是你在 C++ 中创建的,L是数组的长度作为 Goint

于 2015-02-17T17:44:46.610 回答