首页 > 解决方案 > Bazel go_binary c-shared链接模式:header在哪里?

问题描述

我正在尝试使用 Bazel (v1.0.0) rules_go 来构建标题 + 库,就像我使用 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 输出中缺少关联的头文件。使用 go build 进行测试会产生头文件和库。我如何让巴泽尔给我同样的东西。

标签: gobazel

解决方案


linkmode = "c-shared"linkmode = "c-archive"被定义时,还有一些通过在go_binary名称末尾添加后缀来定义的附加目标。因此,例如,您可以构建go_cpp_bridge.c_hdrs以获取头文件。您可以构建go_cpp_bridge.cc一个cc_library可以与其他 C/C++ 目标链接的对象。标头以规则命名go_binary(so 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是跟踪问题。


推荐阅读