Я пытаюсь встроить существующий пакет Go в общую библиотеку C и заголовок, используя CGO .
Я собрал пакет с -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 , но ничего не сказано об экспортев подпакетах. Единственный ключ, который я получил, - через go help buildmode
, но он сказал, что все импортированные подпакеты будут скомпилированы. Я не уверен, поддерживается ли он или я пропустил некоторые конфигурации.
Я бы хотел добиться этого, чтобы иметь возможность модульной //export
функций.