猿问

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

我正在尝试使用 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 进行测试会生成头文件和库。我怎样才能让巴泽尔给我同样的东西。


回首忆惘然
浏览 127回答 1
1回答

DIEA

当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是跟踪问题。
随时随地看视频慕课网APP

相关分类

Go
我要回答