Bazel go_binary c-shared link 模式:header 在哪里?
Bazel go_binary c-shared link mode: Where is the header?
我正在尝试使用 Bazel (v1.0.0) rules_go 构建 header + 库,就像我使用 go build -buildmode=c-archive
一样。我的 BUILD.bzl 文件中设置了以下规则:
go_binary(
name="go_cpp_bridge",
srcs = ["cpp_bridge.go"],
cgo = True,
gc_linkopts=["-buildmode=c-shared"],
linkmode = "c-archive",
visibility = ["//visibility:public"],
)
cpp_bridge.go
的当前代码只是一个hello world,看看是否有效:
package main
import "C"
//export Add
func Add(a, b int) int { return a + b }
func main(){}
Bazel 确实生成了一个库文件,但我在 bazel-bin 输出中缺少关联的 header 文件。使用 go build 进行测试会同时生成 header 文件和库。我如何让 Bazel 给我同样的东西。
当定义了 linkmode = "c-shared"
和 linkmode = "c-archive"
时,还有一些额外的目标是通过在 go_binary
名称的末尾添加后缀来定义的。因此,例如,您可以构建 go_cpp_bridge.c_hdrs
来获取 header 文件。您可以为可以与其他 C/C++ 目标链接的 cc_library
构建 go_cpp_bridge.cc
。 header 以 go_binary
规则命名(因此 go_cpp_bridge.h
)。
为了扩展您的示例,这里有一个有效的构建文件:
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
go_binary(
name = "go_cpp_bridge",
srcs = ["cpp_bridge.go"],
cgo = True,
linkmode = "c-archive",
)
cc_binary(
name = "main",
srcs = ["main.c"],
deps = [":go_cpp_bridge.cc"],
)
还有一个链接到 Go 的 C 程序:
#include <stdio.h>
#include "go_cpp_bridge.h"
int main() {
printf("%lld\n", Add(21, 21));
return 0;
}
这没有记录,因为它不是一个很好的界面。自此实施以来,Bazel 添加了更好的方法来编写 C/C++ 兼容规则,但 rules_go 尚不支持。 #2176 是跟踪问题。
我正在尝试使用 Bazel (v1.0.0) rules_go 构建 header + 库,就像我使用 go build -buildmode=c-archive
一样。我的 BUILD.bzl 文件中设置了以下规则:
go_binary(
name="go_cpp_bridge",
srcs = ["cpp_bridge.go"],
cgo = True,
gc_linkopts=["-buildmode=c-shared"],
linkmode = "c-archive",
visibility = ["//visibility:public"],
)
cpp_bridge.go
的当前代码只是一个hello world,看看是否有效:
package main
import "C"
//export Add
func Add(a, b int) int { return a + b }
func main(){}
Bazel 确实生成了一个库文件,但我在 bazel-bin 输出中缺少关联的 header 文件。使用 go build 进行测试会同时生成 header 文件和库。我如何让 Bazel 给我同样的东西。
当定义了 linkmode = "c-shared"
和 linkmode = "c-archive"
时,还有一些额外的目标是通过在 go_binary
名称的末尾添加后缀来定义的。因此,例如,您可以构建 go_cpp_bridge.c_hdrs
来获取 header 文件。您可以为可以与其他 C/C++ 目标链接的 cc_library
构建 go_cpp_bridge.cc
。 header 以 go_binary
规则命名(因此 go_cpp_bridge.h
)。
为了扩展您的示例,这里有一个有效的构建文件:
load("@io_bazel_rules_go//go:def.bzl", "go_binary")
go_binary(
name = "go_cpp_bridge",
srcs = ["cpp_bridge.go"],
cgo = True,
linkmode = "c-archive",
)
cc_binary(
name = "main",
srcs = ["main.c"],
deps = [":go_cpp_bridge.cc"],
)
还有一个链接到 Go 的 C 程序:
#include <stdio.h>
#include "go_cpp_bridge.h"
int main() {
printf("%lld\n", Add(21, 21));
return 0;
}
这没有记录,因为它不是一个很好的界面。自此实施以来,Bazel 添加了更好的方法来编写 C/C++ 兼容规则,但 rules_go 尚不支持。 #2176 是跟踪问题。