2 回答
TA贡献1877条经验 获得超6个赞
好吧,我想我需要在耻辱立方体里坐一会儿。
在我为编译器寻找的所有选项中,我错过了检查go_binary. 具体来说,显而易见的,out. 实际对应于-o标志的那个go build
我添加out = "awesome.so"了我的go_binary规则,果然,一切正常。
好吧,这浪费了几个小时。感谢杰伊试图提供帮助,很抱歉问了一个愚蠢的问题。
TA贡献1852条经验 获得超7个赞
这可能无法准确回答您的问题,但我可以举一个从 macOS 上的 C 程序调用 Go 共享库的示例。希望这可以让你大部分时间都在那里。
对于
go_binary,您只需要linkmode = "c-shared". 您还需要cgo = True包含 cgo 代码或已导出定义的每个包。您不需要-shared,-fPIC或static = "off".导出的定义应标有
//export注释。有一个隐式声明的目标,其后缀
.c_hdrs为 Go 库构建头文件。它:go_hello.c_hdrs在下面的示例中。实际的头文件名称是go_hello.h,与目标名称匹配。您需要使用
cc_import规则包装生成的文件,以使其可用作 C/C++ 依赖项。#2433是简化该过程的开放问题,但最近才在 Bazel 中实现。任何可以消耗 a 的东西都可以以同样的方式
cc_library消耗cc_import目标。所以你应该能够通过 JNI 调用 Go 函数,尽管我从未尝试过。
构建.bazel
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
go_binary(
name = "go_hello",
srcs = ["hello.go"],
cgo = True,
linkmode = "c-shared",
)
cc_import(
name = "c_hello",
hdrs = [":go_hello.c_hdrs"],
shared_library = ":go_hello",
)
cc_binary(
name = "use",
srcs = ["use.c"],
deps = [":c_hello"],
)
你好.go
package main
import "fmt"
import "C"
//export SayHello
func SayHello() {
fmt.Println("hello")
}
func main() {}
使用.c
#include "go_hello.h"
int main() {
SayHello();
return 0;
}
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报
