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 是跟踪问题。