为了账号安全,请及时绑定邮箱和手机立即绑定

Bazel go_binary c-共享链接模式:标头在哪里?

Bazel go_binary c-共享链接模式:标头在哪里?

Go
回首忆惘然 2023-08-07 18:50:38
我正在尝试使用 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 mainimport "C"//export Addfunc Add(a, b int) int { return a + b }func main(){}Bazel 确实生成了一个库文件,但我在 bazel-bin 输出中缺少关联的头文件。使用 go build 进行测试会生成头文件和库。我怎样才能让巴泽尔给我同样的东西。
查看完整描述

1 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

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



查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信