cgo не экспортирует функции в импортированные пакеты - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь встроить существующий пакет 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 функций.

1 Ответ

0 голосов
/ 17 октября 2019

У них обоих есть свои C.type, так что, насколько я знаю, нет способа импортировать функцию с помощью C.type, но используя связывание.

Я не пробовал, но дал шанс:

import _ "unsafe"

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