go - 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 进行测试会产生头文件和库。我如何让巴泽尔给我同样的东西。
解决方案
当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是跟踪问题。
推荐阅读
- wordpress - 使用 wp_enqueue_scripts 将 css 和 js 链接到我的主题的 Wordpress 不起作用
- xamarin.forms - 评估平台
- android - 防止用户返回上一个屏幕 StackNavigator
- java - JVM 在哪里存储运行时实现的抽象类的信息?
- sql-server - 为什么在插入信息时我的值会重复?
- javascript - D3.js 旭日形按大小排序
- angular - 表格内的 PrimeNG 自动完成
- java - 请我需要有关清单合并失败并出现多个错误的解决方案
- amcharts - amCharts 已聚集但未堆叠
- git - 防止用户将臃肿的 git 提交推送到中央存储库