百科问答小站 logo
百科问答小站 font logo



为什么 Go 和 Rust 常提供静态编译好的 Linux 程序,而 C 不行? 第1页

  

user avatar   ling-jian-94 网友的相关建议: 
      

……?

C最早是不支持动态链接的,那时候全都只能静态链接,后来操作系统技术发展了才有动态链接的。静态链接可以说是动态链接的祖宗。

一直到今天,使用静态链接技术上也是毫无问题的,主要是这么几个毛病:

  1. 某些特殊的库(主要是glibc)一般来说必须使用动态链接,因为可能跟不同版本的内核会不兼容(而且glibc也是一个主要的破坏向前兼容性的原因)
  2. 很多库发行的二进制版本只有动态链接库,要做静态链接,需要自己从源码编译。C的编译出了名的慢,要把所有依赖库都重新静态编译了很费劲。
  3. 动态链接发明出来本来就是有它的优势的,第一依赖库可以独立升级,尤其是对于修复安全问题很重要,而静态链接的任何依赖库要更新都需要整个重新发布binary;第二包的大小也小。
  4. 混用静态链接和动态链接也会产生严重问题,比如某个动态链接的库和程序本身都使用了一个第三方库,但使用的版本不同,一个静态链接了低版本,一个动态链接了高版本,可能会引起严重的问题。

其中第二点可以认为是最关键的。相比来说,golang就可以做到所有的依赖都从源码编译,速度很快,也就没有其他问题了。

如果链接的库并不多,通过修改编译选项编译一个静态链接的二进制文件发布是毫无问题的,NPM社区里面有一部分包起来的可执行程序就是静态链接的(除了glibc等系统库以外)


另外一个相对次要的原因是Linux社区流行这一套基于源码autoconf然后make的工具链,这样的源码在非常多的平台和配置上都能跑起来,可玩性比较好。其他答案提到的跨架构也是一个重要的理由吧。


对了,还有一个非常非常重要的理由:LGPL许可只能动态链接,如果使用静态链接,则整个源码都必须变成LGPL许可。




  

相关话题

  为什么C++在构造函数和析构函数中不能抛出异常? 
  如果有一个arm核心的微型电脑,跟u盘一样大,里面跑linux发行版,带电池,连上usb后就能操作它的屏幕。这东西做成产品,你会买不? 
  为什么大多数程序主函数成功时都return 0; 不return 1; ? 
  C 语言线程间怎么通信? 
  什么是微内核? 
  shell程序中 2> /dev/null 代表什么意思? 
  Linux 出于何种考虑推出 usrmerge,将根目录下的一些文件夹合并到 /usr 下? 
  C 语言线程间怎么通信? 
  C 语言自带函数返回值为指针类型的数组为什么不需要释放内存? 
  可以随身携带一个Linux系统吗? 

前一个讨论
废除死刑会导致刑辩律师收入变化吗?
下一个讨论
宇宙中有哪些复杂的运动?





© 2025-05-14 - tinynew.org. All Rights Reserved.
© 2025-05-14 - tinynew.org. 保留所有权利