我正在尝试使用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符号。
//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
函数进行模块化。
答案 0 :(得分:0)
他们两个都有自己的C.type
,据我所知,除了使用链接之外,没有其他方法可以通过C.type
导入函数。
我没有尝试过,但是给了机会:
import _ "unsafe"
//go:linkname FuncInSubPackage c.FuncInSubPackage
//export FuncInSubPackage
func FuncInSubPackage(max C.int) C.int