草庐IT

CGO_ENABLED

全部标签

戈朗 : cgo extern is not working

我正在尝试使用以下示例(在go-wiki->GlobalFunctions给出)为golang运行cgo:foo.go文件:packagegocallbackimport"fmt"/*#includeexternvoidACFunction();*/import"C"//exportAGoFunctionfuncAGoFunction(){fmt.Println("AGoFunction()")}funcExample(){C.ACFunction()}foo.c文件:#include"_cgo_export.h"voidACFunction(){printf("ACFunction(

GoLang CGO 文件句柄

我正在使用nativelinuxC二进制文件,它有一个相当昂贵的初始化调用,我想在应用程序启动时执行一次。这个调用应该在内部打开一堆文件句柄供以后使用。当我从Go调用这个昂贵的初始化C函数时,它成功完成并正确打开文件,但这些句柄仅在调用C函数期间打开!这意味着当我从Go中针对同一个库调用连续的C函数时,文件句柄不再打开并且调用失败。我已经使用lsof命令验证了这一点。有趣的是,当初始化调用以及对后续行为的调用被组合到一个C函数中,然后从Go调用该函数时,文件将打开并保持打开状态,从而成功完成所有所需的功能。在从Go多次调用C函数之间是否存在某种未记录的cgo行为,即“清理”、关闭甚至泄

go - 如何在不使用 cgo 的情况下将 Go 函数绑定(bind)到 C 调用?

在我正在进行的项目中,我需要使用来自Go的一堆C函数。当前的实现是使用cgo来实现这一点,但这样做会产生巨大的性能影响,我正试图将其消除。cgo将所有C代码标记为系统调用,使调度程序在需要时分配新线程。由于我项目中大约80%的CPU时间花在了繁重的C工作上,这很快导致有很多线程(500+而不是GOMAXPROCS(=8)),我的Linux内核不太喜欢。采用通常的“限制器”方法(使用缓冲channel锁定cgo调用)会导致大量互斥锁,从而降低程序速度。我想在这个项目中继续使用Go,因为它是管理并发性的好方法。我尝试过的事情:在src/runtime/cgocall.go中注释掉一些类似e

go - 在 Alpine 中找不到运行时/cgo

在我安装的alpine:edge容器中goviaRUNapkadd--no-cachemusl-devgo然后我尝试运行gogetgithub.com/golang/protobuf/protoc-gen-go。这会导致错误消息:go:findinggithub.com/golang/protobuf/protoc-gen-golatestgo:findinggithub.com/golang/protobufv1.3.1go:downloadinggithub.com/golang/protobufv1.3.1go:extractinggithub.com/golang/protob

c - 当我通过 Cgo 导入 2 个使用 C 包的不同包时,Go 编译返回体系结构 x86_64 错误的重复符号

这是我的代码:packagemainimport(kusb"github.com/karalabe/usb"tusb"github.com/trezor/trezord-go/usb")funcmain(){kusb.Enumerate(0,0)tusb.InitHIDAPI(nil)}当我编译时(我使用gomod来管理包),它返回这个错误:duplicatesymbol_libusb_dev_mem_allocin:/var/folders/fm/1rln65d94mn45s0h5l78tdyh0000gp/T/go-link-624554542/000002.o/var/folde

go - 我可以通过 CGo 定义接受原生 Go 类型的 C 函数吗?

为了与现有库集成,我最终需要编写一些额外的C代码来提供可通过CGo使用的接口(interface)。为了避免冗余数据副本,我希望能够将一些标准的Go类型(例如Go字符串)传递给这些C适配器函数。我可以看到在CGo生成的头文件中定义了GoString和GoInterface类型供导出的Go函数使用,但是有没有办法在中使用这些类型CGo会识别我自己的函数原型(prototype)吗?目前,我最终在C原型(prototype)中使用了void*并在Go端传递了unsafe.Pointer(&value)。虽然这不像我想要的那样干净(一方面,它使C代码能够写入值)。更新:澄清一下,我确实知道G

c - 当C库使用不透明结构指针时,如何解决cgo中的 "bad pointer in write barrier"panic

我目前正在围绕C库编写Go包装器。该C库使用不透明的结构指针来隐藏界面中的信息。但是,底层实现将size_t值存储在那里。这会导致生成的程序出现运行时错误。重现问题的最小工作示例如下所示:main.go:packagemain/*#include"stddef.h"//Createanopaquetypetohidethedetailsoftheunderlyingdatastructure.typedefstructHandlePrivate*Handle;//Inreality,theimplementationusesatypederivedfromsize_tfortheHan

go - 在 CGO 中正确使用空结构

使用gssapi.hstructgss_name_struct;typedefstructgss_name_struct*gss_name_t;我想弄清楚如何通过以下方式正确初始化包含此变量的变量varoutput_nameC.gss_name_t=&C.struct_gss_name_struct{}但是像gss_import_name这样的函数就像我将空指针传递给它们一样。使用CGO正确初始化和使用这些空结构的正确方法是什么? 最佳答案 Go的严格类型使得typedefs难以使用。让你的Go看起来清晰的最好方法是用C编写一个小的

cgo - 如何将字符串转换为 C 固定字符数组

我正在尝试在我的Go代码中实例化一个C结构。结构定义如下(在我无法修改的外部库中):typedefstruct{charfield1[256];}S1接下来,我这样做了:funcmyfunc(mystrstring){//WeneedtoconvertmystrfromstringtochararraycStr:=C.CString(mystr)deferC.free(unsafe.Pointer(cStr)//Shouldworknows1:=&C.S1{field1:cStr}//Dosomethingwiths1...}但它无法编译,因为:cannotusecStr(type*C

go - cgo:如何将结构数组从 c 传递到 go

C部分:structPerson{...}structPerson*get_team(int*n)围棋部分:n:=C.int(0)varteam*C.struct_Person=C.get_team(&n)deferC.free(unsafe.Pointer(team))我可以通过这种方式获取数组的第一个元素。但是如何得到包含n个元素的整个数组呢?以及如何安全释放它们? 最佳答案 首先,即使你使用的是Go,当你添加cgo时,就不再有任何“安全”。由您决定何时以及如何释放内存,就像您在使用C语言编程一样。在go中使用C数组最简单的方法