草庐IT

CGO_CFLAGS

全部标签

go - cgo:Go 内存中的 Go 指针

代码是否:unsafe.Pointer(&du)du是满足以下列表中规则1的interface吗?https://github.com/golang/go/issues/12416GocodemaypassaGopointertoCprovidedthattheGomemorytowhichitpointsdoesnotcontainanyGopointers.ThatrulemustbepreservedduringCexecution,inthattheprogrammustnotstoreanyGopointersintothatmemory.换句话说,指向Gointerface

cgo 如何设置 C union 值

假设我有一个如下所示的C结构。我可以使用不安全指针读取数据union值,但无法弄清楚如何设置union值数据?typedefstructval{char*var1;typetype;union{char*binary_val;char*bits_val;boolbool_val;doubledecimal64_val;char*enum_val;char*identityref_val;char*instanceid_val;int8_tint8_val;int16_tint16_val;int32_tint32_val;int64_tint64_val;char*string_val

windows - 将 Windows 库与 cgo 一起使用

我正在尝试构建一个使用TagLib的Go包,而且我在弄清楚如何将已编译的库与cgo一起使用时遇到了一些麻烦。我编译了TagLib,在中吐出了tag.dll、tag.exp、tag.lib>taglib目录。bindings目录中还有taglib_c.*二进制文件,但我假设我只是忽略了它们。如何使用已编译的库与Go一起使用?我在OSX上的项目的源代码中设置了所有内容,但是我需要做什么才能在Windows上编译它?编译后的库(dll或静态库?)是否必须与源代码位于同一目录中?标题呢? 最佳答案 不幸的是,我没有可用的Windows机器来

memory-management - CGO:如何使用 malloc 从 go 中释放在 C 中分配的内存以避免内存泄漏

我正在尝试使用CGO从golang调用复杂算法的优化C++CPU绑定(bind)实现。基本上,它将一个字符串传递给C++函数并取回一个字符串。代码的简化版本如下所示:算法.gopackagemain//#cgoLDFLAGS://#include//#include//#include//char*echo(char*s);import"C"import"unsafe"funcmain(){cs:=C.CString("Hellofromstdio\n")deferC.free(unsafe.Pointer(cs))varechoOut*C.char=C.echo(cs)//defer

go - CGO:在 LPCWSTR 和字符串之间转换

我正在为一个库编写CGO绑定(bind),该库将LPCWSTR用于其所有字符串类型。如何将C.LPCWSTR转换为string,反之亦然? 最佳答案 您应该能够将LPCWSTR“转换”为[]uint16,并使用utf16包解码字符//takeaC.wstrpointer,andconvertittoagoslice//`sz`isthelengthoftheLPCWSTRwstr:=(*[1您通常不希望将Go指针传递到您的C代码中,因此当从字符串转换为LPCWSTR时,您需要在C中分配内存。从Go字符串转换的解决方案s可能看起来像:

使用CGo调用带有双指针输出参数的C函数

我正在尝试找出调用thisfunction的正确方法:size_tfz_buffer_storage(fz_context*ctx,fz_buffer*buf,unsignedchar**datap){if(datap)*datap=(buf?buf->data:NULL);return(buf?buf->len:0);}使用CGo获取底层字符串及其长度作为Go中的字节数组。这是正确的做法吗?varbufferContents*C.ucharlength:=C.fz_buffer_storage(ctx,buf,&bufferContents)bytes:=C.GoBytes(unsa

go - 警告 : unused variable ‘_cgo_a’

什么是“_cgo_a”变量?我正在尝试链接一个C++静态库。欢迎词.cpp#include"greeter.h"#includevoidgreet(){std::cout欢迎词.h#ifndefGREETER_H_#defineGREETER_H_#ifdef__cplusplusextern"C"{#endifvoidgreet();#ifdef__cplusplus}#endif#endif我将上面的代码编译成一个静态库,如下所示:$g++-cgreeter.cpp$arvfxgreeter.o-olibgreeter.a这是我的main.gopackagemain//#cgoCF

Cgo 可以调用在另一个目录中声明的 C 函数吗?

似乎我不能使用Cgo调用在另一个目录而不是当前Go包中声明的C函数。所有文件的编码://TestGoCallOC.gopackagemain/*#include"test.h"#cgoCFLAGS:-xobjective-c#cgoLDFLAGS:-frameworkFoundation*/import"C"import("fmt")funcmain(){fmt.Println(C.fortytwo())}//test.h#include#includeintfortytwo();//test.m#include"test.h"intfortytwo(){return42;}如果我将所

go - 为什么 CGO_ENABLE 会对虚拟内存产生如此大的影响?

我有一个用Golang编写的小守护进程,它循环工作并做一些事情。我发现,在使用CGO_ENABLE=1或CGO_ENABLED=0编译时,守护进程的行为有所不同。例如,在CGO_ENABLE=1(默认值)的情况下,程序的VSZ在短时间内(一小时内)膨胀到1-2GB。当CGO_ENABLED=0时,VSZ在很长一段时间内(数天)是相同的。看看下面的数字:CGO_ENABLED=1(守护进程已经工作了5分钟)$grep-E'VmSize|VmRSS'/proc/14916/statusVmSize:1084052kBVmRSS:12524kBCGO_ENABLED=0(守护进程已工作约30

不使用 CGO 将 C 字符串转换为 Go 字符串

我正在使用GoWindows系统调用库从DLL中的函数中获取数据。这一切都很好,但我想不出一种方法来将LPCTSTR(指向C字符串的指针)转换为正确的Go字符串而不使用CGO。我想尽可能避免使用CGO,因为CGO代码在Windows上的两个选项(交叉编译和在Windows上安装gcc)仍然相当复杂。 最佳答案 如果您有一个8位字符串,您可以将LPCTSTR指针转换为适当大小的[]byte,并将其复制到一个新的字符串或slice。a:=(*[1如果LPCTSTR指向包含16位unicode字符的LPCWSTR,则可以使用utf16包将