当前位置:首页 > 科技  > 软件

为什么不建议交付静态链接的可执行文件给用户?

来源: 责编: 时间:2023-12-18 09:46:26 288观看
导读会C/C++/Go/Rust的开发者,往往遇到过代码编译中需要选择使用动态还是静态链接的问题。也知道C/C++开发中,静态编译不是推荐的做法;而Go语言改进了对静态编译的支持,对编译的文件做了优化,与 C 语言不同的是,Go 语言的标准库

会C/C++/Go/Rust的开发者,往往遇到过代码编译中需要选择使用动态还是静态链接的问题。O7228资讯网——每日最新资讯28at.com

也知道C/C++开发中,静态编译不是推荐的做法;而Go语言改进了对静态编译的支持,对编译的文件做了优化,与 C 语言不同的是,Go 语言的标准库是默认静态链接的,而用户编写的代码可以选择使用动态链接库或静态链接库。O7228资讯网——每日最新资讯28at.com

问题来了:如果C代码文件include的头文件包含很多库函数,但main() 函数只用到其中一个函数,那么生成静态链接的可执行文件的时候,linux gcc编译器会把库函数中未用到的库函数也包含到可执行文件里吗?O7228资讯网——每日最新资讯28at.com

O7228资讯网——每日最新资讯28at.com

知识点:Linux的动态库静态库

在 Linux 系统中,动态库和静态库是两种不同类型的库文件,它们在程序的编译和运行过程中扮演着不同的角色。O7228资讯网——每日最新资讯28at.com

  • Linux下的动态库(Dynamic Library)是指在程序运行时动态加载和链接的库文件。动态库通常以.so(Shared Object)为后缀名,它们包含了可执行代码和数据,可以被多个程序共享。动态库的优点是可以减少程序的大小,提高内存利用率,并且可以在程序运行时动态加载和更新库文件。Linux下的静态库(Static Library)是指在程序编译时被静态链接到可执行文件中的库文件。静态库通常以.a(Archive)为后缀名,它们包含了可执行代码和数据,并且在程序编译时被直接嵌入到可执行文件中。静态库的优点是可以提高程序的运行速度,因为不需要在程序运行时动态加载库文件。
  • 动态库和静态库通常存储在系统的标准库路径下,具体位置取决于操作系统和编译器的配置。在 Linux 系统中,动态库通常存储在/lib和/usr/lib目录下,而静态库通常存储在/lib和/usr/lib目录或/usr/lib64目录下的lib.a子目录中。

你可以在/etc/ld.so.conf 系统配置文件中指定动态库的路径,然后使用sudo ldconfig命令来更新动态库的缓存,以确保程序能够正确地找到动态库。你还可以使用ldd命令来查看程序所依赖的动态库。O7228资讯网——每日最新资讯28at.com

实际上 /etc/ld.so.conf 文件的内容是:O7228资讯网——每日最新资讯28at.com

include /etc/ld.so.conf.d/*.conf

所以当你需要告诉系统,去加载自己特定目录下的动态库所在目录的时候,就可以在/etc/ld.so.conf.d/ 目录下新建以.conf后缀的文本文件,然后sudo ldconfig,就可以更新linux的动态库缓存信息,系统就能知道你的路径下的动态库的存在。O7228资讯网——每日最新资讯28at.com

最后回答本文开头提出的那个问题:O7228资讯网——每日最新资讯28at.com

C代码文件在生成静态链接的可执行文件时,Linux GCC 编译器会将头文件中所有声明的函数都包含到可执行文件中,无论它们是否被 main()函数直接使用。O7228资讯网——每日最新资讯28at.com

O7228资讯网——每日最新资讯28at.com

这是因为在静态链接中,编译器会将所有用到的库函数都直接嵌入到可执行文件中,以确保程序在运行时不需要依赖外部库文件。因此,即使 main()函数只使用了头文件中声明的一个函数,编译器仍然会将头文件中所有声明的函数都包含到可执行文件中。O7228资讯网——每日最新资讯28at.com

这可能会导致可执行文件的大小增加,但可以确保程序在运行时不需要依赖外部库文件,从而提高了程序的独立性和可移植性。O7228资讯网——每日最新资讯28at.com

如果希望减少可执行文件的大小,可以考虑使用动态链接库SO(Windows下是DLL,Mac下为dylib后缀的)来实现库函数的共享。对于操作系统来说,多个应用软件都依赖同一个动态库,那么动态库的文件只需要一份,这比起静态库,大大减少了磁盘占用,也提高了操作系统的内存资源管理效率。O7228资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-48342-0.html为什么不建议交付静态链接的可执行文件给用户?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C++17中的if和switch语句初始化

下一篇: 尝试借助CSS @container实现多行文本展开收起

标签:
  • 热门焦点
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现“美团直播”的固定入口。在直播聚合页面,外卖“神枪手”直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • 机构称Q2全球智能手机出货量同比下滑11% 苹果份额依旧第2

    7月20日消息,据外媒报道,研究机构的报告显示,由于需求下滑,今年二季度全球智能手机的出货量,同比下滑了11%,三星、苹果等主要厂商的销量,较去年同期均有下
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top