Go 编译的可执行文件是否有动态库链接?
生活随笔
收集整理的這篇文章主要介紹了
Go 编译的可执行文件是否有动态库链接?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Go 引用了其他包的話,是將引用的包都編譯進去。用 ldd 看幾個 Go 編譯出來的二進制程序有的沒有動態鏈接庫的使用。但是有的又有引用動態鏈接庫,這個是為什么?
回答:Go 默認是開啟 CGO_ENABLED 的,即 CGO_ENABLED=1 。但編譯出來的二進制程序究竟有無動態鏈接,取決于你的程序使用了什么包。如果就是一個 hello world,那么編譯出來的將是一個純靜態程序。
如果你依賴了網絡包或一些系統包,比如用 http 包編寫了一個 web server,那么編譯出來的二進制程序又會是一個包含動態鏈接的程序。
原因就在于目前的 Go 標準庫中,某些功能具有兩份實現,一份是 C 語言實現的,一份是 Go 語言實現的。
- 在
CGO_ENABLED開啟的情況下,Go鏈接器會鏈接C語言的版本,于是就有了依賴動態鏈接庫的情況。 - 如果你將
CGO_ENABLED置為 0,你再重新編譯鏈接,那么Go鏈接器會使用Go版本的實現,這樣你將得到一個沒有動態鏈接的純靜態二進制程序。
總結
以上是生活随笔為你收集整理的Go 编译的可执行文件是否有动态库链接?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国中密度纤维板市场
- 下一篇: 2022-2028年中国刨花板市场投资分