gpt4 book ai didi

go - cgo 不导出导入包中的函数

转载 作者:行者123 更新时间:2023-12-01 22:28:17 26 4
gpt4 key购买 nike

我正在尝试使用 CGO 将现有的 Go 包构建到 C 共享库和 header 中.

我用 -buildmode c-shared 构建了这个包如记录。

-buildmode=c-shared
Build the listed main package, plus all packages it imports,
into a C shared library. The only callable symbols will
be those functions exported using a cgo //export comment.
Requires exactly one main package to be listed

并使用了 //export Func将函数公开为 C 符号。

全部 //export main 中的函数包已正确导出。但是,当我将这些函数移动到子包(使用 //export )时,这些函数不会被导出。我在 main中导入了子包包,太。

这是我的代码。

main.go
package main

import "C"

import (
"fmt"
_ "github.com/onosolutions/archanan-cgo/c"
"math/rand"
)

// FuncInMain generates a random integer.
//export FuncInMain
func FuncInMain(max C.int) C.int {
return C.int(rand.Intn(int(max)))
}

func main() {
fmt.Printf("Hello World %d!\n", int(FuncInMain(256)))
}

c/c.go
package c

import "C"

import (
"math/rand"
)

// FuncInSubPackage generates a random integer.
//export FuncInSubPackage
func FuncInSubPackage(max C.int) C.int {
return C.int(rand.Intn(int(max)))
}

那么只有 FuncInMain被导出。

我通读了 CGO documentation ,但是没有关于在子包中导出的内容。我得到的唯一线索是通过 go help buildmode ,但它说所有导入的子包都会被编译。我不确定它是不受支持还是我错过了一些配置。

我很想实现这一点,以便能够模块化 //export职能。

最佳答案

他们都有自己的C.type ,据我所知,无法使用 C.type 导入函数但使用链接。

我没有尝试,但给它一个机会:

import _ "unsafe"

//go:linkname FuncInSubPackage c.FuncInSubPackage
//export FuncInSubPackage
func FuncInSubPackage(max C.int) C.int

关于go - cgo 不导出导入包中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58433624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com