【问题标题】:cgo doesn't export functions in imported packagescgo 不导出导入包中的函数
【发布时间】: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 _ 的含义。

标签: go cgo


【解决方案1】:

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

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

import _ "unsafe"

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

【讨论】:

  • 它不起作用。不过我明白你的意思,谢谢指出。
  • 重点是函数只能从main包中导出,并且导入的golang的C类型不同,所以如果上面一个不行的话是不可能的,需要换行或者复制粘贴。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 2017-01-04
  • 2020-04-26
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2022-01-18
  • 2021-09-18
相关资源
最近更新 更多