亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號