【发布时间】:2020-02-14 10:24:50
【问题描述】:
我正在尝试使用 CGO 将现有的 Go 包构建到 C 共享库和标头中。
我使用-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 符号。
main 包中的所有//export 函数都已正确导出。但是,当我将这些函数移动到子包(使用//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 函数。
【问题讨论】:
-
我没有太多使用 CGO 的经验,但我会尝试将这些包导入为 dot-imports
-
@PhucTran 为什么
FuncInSubPackage会在主包中显示为符号?导入为_意味着它除了初始化副作用外未使用,因此无法访问符号。 Go 包总是独立的,做一个简单的纯 Go 概念证明来看看发生了什么。 -
@EliasVanOotegem 我尝试了点导入,它也不起作用。
-
明白你的想法@JimB,我没有注意到 import as
_的含义。