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

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

有沒有辦法將 Go 可執行文件分成幾個文件?

有沒有辦法將 Go 可執行文件分成幾個文件?

Go
慕姐4208626 2023-06-01 14:20:23
我正在運送幾個用 Go 編譯的可執行文件。每個可執行文件本身并不包含很多代碼,但它們每個都使用一個公共庫,其中包括日志記錄、配置管理、通信層等……這導致每個可執行文件的大小在 15-20mb 之間,有時只有 1000 行代碼。Go 中是否有一種方法(當前可用或計劃在未來發布)允許將應用程序分成幾個文件(即 Windows 中的 dll,Linux/Mac 中的 .so)?我知道我可以編譯這個庫,然后將它用作外部二進制文件,但那樣我就無法獲得類型系統和 Go 編譯器優化的好處。我在這里錯了嗎,有辦法嗎?
查看完整描述

2 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

簡短的回答:有點?

聽起來您要完成的是一個共享庫。

Go 編譯器從 1.5 開始就可以使用-buildmode=c-shared構建標志生成共享庫:

go?build?-o?helloworld.so?-buildmode=c-shared

而且,從Go 1.10開始,Windows 還支持該功能

所以,編譯成DLL也是一行:

go?build?-o?helloworld.dll?-buildmode=c-shared

您將要遇到的問題實際上是使用這些庫,尤其是以跨操作系統的方式:

在 *nix 中,您可以使用 CGO 來完成此操作:

package example


// #cgo LDFLAGS: -lfoo

//

// #include <foo.h>

import "C"


func main() {

? ? C.bar()

}

Windows 擁有自己的Wiki(誰感到驚訝?)。

我會給你一些關于這個的想法:

  1. 15-20mb 的二進制文件沒有任何問題(雖然,您應該嘗試使用upx來減少一些脂肪,因為為什么不呢?),當您推動 10 到 100 的演出時,您應該擔心。現在空間很便宜。

  2. 編寫可以編譯成單個二進制文件的東西,而不管操作系統如何,是 Go 最好的好處之一。

  3. CGO_ENABLED=0為您的二進制文件節省大量空間。保持啟用狀態(您需要使用這些功能)對您沒有任何好處。

  4. 您正確地認為,由于編譯器無法針對包含的庫進行優化,因此最終您不會在小型用例中節省太多空間(如果有的話)。

我的最后一點,那我就不再對你說教了:專注于編寫代碼。二進制大小不應該是你關心的問題,除非你試圖適應嵌入式設備。

祝你好運朋友。


查看完整回答
反對 回復 2023-06-01
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

您運送的物品彼此密切相關嗎?如果是這樣,將它們組合成一個可執行文件可能更有意義,該可執行文件在命令行上接受命令來決定開始執行哪個“可執行文件”。

因此,您不必運送“cmd1”、“cmd2”和“cmd3”,而只需運送一個可以通過這種方式調用的程序

$ prog cmd1

$ prog cmd2

$ prog cmd3

您必須做一些額外的工作來解析第一個參數并決定啟動哪個子命令。



查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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