草庐IT

CGO_ENABLED

全部标签

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包将

linux - cgo 交叉编译找不到库

我已经在Linux中围绕信号量函数编写了一个包装器。这在过去的Go1.3和Go1.4上对我有用,但我需要使用这个包装器重建我的应用程序,它不再使用Go1.6.2或Go1.7rc5构建。我编写了一个产生相同错误的简单测试应用程序:packagemainimport("fmt""os""linux/semaphore")funcmain(){varsemasemaphore.Semaphoreiferr:=sema.Open("/test",0644,1);err!=nil{fmt.Printf("%v\n",err)os.Exit(1)}iferr:=sema.TryWait();err

go - 如何将字符串从 JSON 返回给 C 调用者(Golang CGO)?

我正在尝试在Go中开发一个将由C++程序调用的例程。Go如下所示:packagemainimport("C""encoding/json""log")typekeydatastruct{Keystring`json:"key"`Errorstring`json:"Error"`}funclookupKey()string{//simplifiedtoremovethecalltowebservicebody:="{\"key\":\"blahblah\",\"Error\":\"\"}"k:=keydata{}err:=json.Unmarshal([]byte(body),&k)if

c - 为什么 dlsym 在 cgo 中产生的结果与在 c 中产生的结果不同?

我有两个相同行为的实现,我认为它们应该产生相同的结果,但却产生了不同的结果。当使用cgo在Go中编译时,我得到的符号地址解析与在C中编译时不同。我想了解原因。我将问题简化为几个小例子,一个用C语言,一个用Go语言。我在我的Mac笔记本电脑上运行的Ubuntu18Docker容器中测试了这些。测试.c://gcctest.c-D_GNU_SOURCE-ldl//Output:Real:0x7fd05559d7d0Current:0x7fd05559d7d0#include#includeintmain(){void*fd=dlopen("libc.so.6",RTLD_LAZY);voi