我正在尝试将一个C++库连接到一个用Go编写的应用服务器。目标是C++库和应用服务器都在开发一个通用的数据结构,这意味着:
我在玩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++到将来的路,但我也对另一种方式感兴趣。
谢谢你提前帮忙。
发布于 2015-02-17 09:44:46
这里:
return *int(C.CCreateArray())
可以写成
return *((int)(C.CCreateArray()))
您正在取消引用一个int
,这将导致:
invalid indirect of int(_Cfunc_CCreateArray()) (type int)
在这句话里,只注意到这一部分:
(int)(C.CCreateArray())
您正在尝试将一个*C.int
转换为一个int
,它不能工作,因为第一个是指针,而第二个不是。
除此之外,@tadman在您问题的注释中提到的内存管理问题,Go并不像C那样将数组表示为指向其第一个元素的指针。
如果您想共享int
的宽度,您必须对它们的宽度进行具体说明: Go中的int
具有一个与拱形相关的宽度,以及一个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
中创建的是数组的长度作为Go int
。
https://stackoverflow.com/questions/28566242
复制