首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么.so文件总是比.a文件小?(源代码是相同的。)

.so文件和.a文件都是编译后的二进制文件,但它们在存储方式和使用场景上有所不同,因此.so文件通常比.a文件小。

首先,.a文件是静态库文件,它包含了一组目标文件的集合,这些目标文件在编译时被链接到最终的可执行文件中。静态库文件中的目标文件是完整的,包含了所有需要的代码和数据,因此.a文件的大小相对较大。

而.so文件是共享库文件,也称为动态链接库。它包含了一组目标文件的共享代码和数据,这些目标文件在运行时被动态加载到内存中,并被多个程序共享使用。由于.so文件是共享的,因此它只包含了被多个程序共享的代码和数据,而不包含每个程序独有的部分,这使得.so文件的大小相对较小。

另外,.so文件的动态加载机制也带来了一些优势。由于.so文件在运行时才被加载,因此可以实现代码的共享和更新,减少了内存的占用和可执行文件的体积。此外,动态链接库的使用还可以提高程序的灵活性和可维护性,因为可以在不重新编译整个程序的情况下,通过更新.so文件来修复bug或添加新功能。

总结起来,.so文件比.a文件小是因为它只包含了共享的代码和数据,而不包含每个程序独有的部分。.so文件的动态加载机制还带来了灵活性和可维护性的优势。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云原生应用引擎(TAE):https://cloud.tencent.com/product/tae
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN加速(CDN):https://cloud.tencent.com/product/cdn
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java如何校验两个文件内容相同

今天做文件上传功能,需求要求文件内容相同不能重复上传。感觉这个需求挺简单就交给了一位刚入行新同学。等合并代码时候发现这位同学居然用文件名称相同文件大小相同作为两个文件相同依据。...文件Hash校验 如果两个文件内容相同,那么它们摘要应该是相同。这个原理能不能帮助我们鉴定两个文件是否相同呢?...我又把yml文件内容作了改动,断言就false了。这证明了单个文件情况下,内容不变,hash不变。...新建文件会根据特定算法返回一个固定值,比如SHA-1算法下文件: da39a3ee5e6b4b0d3255bfef95601890afd80709 结论 通过实验证明了: 在相同算法下,...任何两个内容相同文件摘要值都是相同,和路径、文件名、文件类型无关。 文件摘要值会随着文件内容改变而改变。

1.9K30

为什么你的话题爬虫 topic 文件总是

话题爬虫 WeiboTopicScrapy.py 开源以来,收到最多反馈就是:为什么我爬了那么久,我 topic 文件总是没有 csv 文件生成?...其实程序一运行起来,没有在控制台打印出每一页微博具体信息,就可以断定你操作方式出了问题,不必等上十几二十分钟。 我总结了话题爬虫所有可能错误及解决办法,在此统一说明。...cookie 复制错了 话题爬虫针对 weibo.cn ,你需要在 weibo.cn 站 login 页复制 cookie。 ?...cookie 没有过期还是出现了和 cookie 过期一样空白 这个错误和 cookie 过期差异在于,通常是在页码很大,比如 100 以上情况,这个时候,有两个原因: 本次话题搜索结果全部下载下来了...修改了一点 Bug 当 filter=0 即抓取所有微博时,保存 csv 文件表头和表格内容会错位,现已修复并推送 Github。

81010

Oracle导出文件为什么用Excel打开乱码?

Oracle导出文件为什么用Excel打开乱码? 1 问题现象 Oracle字符集AL32UTF8,查询表中非英文字符显示正常,但是用utl_file写到CSV文件用Excel打开乱码。...2 问题分析 首先可以肯定: (1)utl_file写文件按照二进制输出,不会改变数据编码,它不受环境变量NLS_LANG控制。 (2)数据库中数据正常。...那么,Excel错误很可能Excel本身问题,测试下用Notepad++打开文件,显示正常,显示格式为UTF8无BOM格式。...如果用Notepad++把文件转换成UTF8格式,即加上BOM,再用Excel打开就是正常了。...3 解决方案 如果需要utl_file导出UTF8格式文件用Excel打开没有乱码,可以在文件头加上BOM,在Oracle中可以用chr(15711167)表示。

2.3K41

《大胖 • 课》- 我这样理解文件上传原理

这是《大胖课》栏目的专题一、《说说文件上传那些事儿》第一节-《文件上传原理概述》 之前发过一篇长文,内容太长,阅读体验太差,很难读完,换作我也没这个耐心,所以借此专题进行分段介绍,短小精悍,直达主题...Content-Disposition: form-data 为固定值,表示一个表单元素,name 表示表单元素 名称,回车换行后面就是name值,如果上传文件就是文件二进制内容。...解析 客户端发送请求到服务器后,服务器会收到请求消息体,然后对消息体进行解析,解析出哪普通表单哪些附件。...怎样解析 可能大家马上能想到通过正则或者字符串处理分割出内容,不过这样行不通,二进制buffer转化为string,对字符串进行截取后,其索引和字符串不一致,所以结果就不会正确,文件虽然能生成,...但文件无效,除非上传就是字符串,比如base64。

56720

Roslyn 将这个文件放在你项目文件夹,无论哪个控制台项目都会输出林德熙

Directory.Build.props 文件,整个文件夹内控制台项目就会输出 林德熙 想要知道怎么做,请看下面 在开始阅读本文之前,需要让大家知道什么 Directory.Build.props...E:\\ 工程可以被这个文件修改 详细请看 Roslyn 使用 Directory.Build.props 文件定义编译 现在我告诉小伙伴,将这个文件放在你文件夹内,然后他控制台项目都会输出 林德熙如何做到...实际上很简单,我只需要在 Directory.Build.props 定义编译过程,移除原来所有文件,然后将 输出林德熙文件加入到编译,这样就可以 于是来写一个简单代码,输出 林德熙..."); } } } 那么现在问题,我刚才说将这个文件放在你项目文件夹,但是要输出林德熙代码需要放在一个文件,当然不能放两个文件,那么可以怎么做?...在这个 Target 里面就定义了代码文件路径,然后通过移除现在所有的文件,添加写入文件方法,让编译时候运行输出 林德熙 这里需要注意 BeforeTargets 需要写为 编译之前

76520

tcp传输过程可靠,那为什么许多较大下载最终还要校验文件完整性?

大家好,我飞哥! 前几天我在知乎上回答过一个问题,这个问题问比较有意思。我回答了一下,收获赞还不少,所以今天分享给大伙儿。...虽然tcp传输过程可靠,但确实在大文件下载时候还是应该校验一下。...飞哥总结原因有如下几个: 1)TCP 可靠传输就是保证在传送丢失或者包校验和出错时候重传,但 crc 校验只能大概判断一下,并不能保证数据 100% 正确。...或者读取内核中数据时候发生了极低概率内存翻转等错误,或者说接收正确,但是写硬盘时候出错了。 以上这些这些错误都是所谓可靠 tcp 所无法照顾到场景。...总之,tcp 可靠有一定局限范围,在应用中有各种各样错误无法靠传输过程可靠来解决。所以,大文件下载都是需要最终在校验一遍完整性

86830

代码 | 自适应大邻域搜索系列之(1) - 使用ALNS代码框架求解TSP问题

前言 上次出了邻域搜索各种概念科普,尤其LNS和ALNS具体过程更是描述得一清二楚。不知道你萌都懂了吗? 编相信大家早就get到啦。...得到我们目标文件:libALNS-framework.so。这是ALNS框架动态链接库,稍后我们要使用到。 ? 可以在该目录下看到: ?...最终得到我们程序TSP.exe。这里还有一步,把刚刚编译好libALNS-framework.so文件复制到当前目录,TSP程序运行需要用到它。 ?...如果需要求其他TSP问题,在编修改好main.cpp文件里,把城市坐标和CITY_SIZE改过来,重新编译tsp文件夹里面的内容就行。 ?...最优解7542,至于这里为什么7542少,原因代码算总距离时候没有加上第一个和最后一个city距离。 03 小结 最后再多说两句,上述求解代码根据ALNS框架定制而来

74320

代码 | 自适应大邻域搜索系列之(1) - 使用ALNS代码框架求解TSP问题

前言 上次出了邻域搜索各种概念科普,尤其LNS和ALNS具体过程更是描述得一清二楚。不知道你萌都懂了吗? 编相信大家早就get到啦。...2.2 修改源代码 找到\trunk\src\alns下OperatorManager.cpp: ? 打开,在头文件位置加入下面这句话,把调试模式给禁用掉: ?...得到我们目标文件:libALNS-framework.so。这是ALNS框架动态链接库,稍后我们要使用到。 ? 可以在该目录下看到: ?...这里还有一步,把刚刚编译好libALNS-framework.so文件复制到当前目录,TSP程序运行需要用到它。 ? 最后可以在命令行下输入TSP,运行我们程序: ? 至此,已经完成了。...最优解7542,至于这里为什么7542少,原因代码算总距离时候没有加上第一个和最后一个city距离。 03 小结 最后再多说两句,上述求解代码根据ALNS框架定制而来

54721

自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题

前言 上次出了邻域搜索各种概念科普,尤其LNS和ALNS具体过程更是描述得一清二楚。不知道你萌都懂了吗?编相信大家早就get到啦。...[1240] 下载源代码源代码下载下来,然后解压到某个位置(路径不要有中文)。...[1240] 得到我们目标文件:libALNS-framework.so。这是ALNS框架动态链接库,稍后我们要使用到。...最终得到我们程序TSP.exe。这里还有一步,把刚刚编译好libALNS-framework.so文件复制到当前目录,TSP程序运行需要用到它。...最优解7542,至于这里为什么7542少,原因代码算总距离时候没有加上第一个和最后一个city距离。 最后再多说两句,上述求解代码根据ALNS框架定制而来

76231

Python和C++混合编程(使用Boost编写Python扩展包)

得益于机器学习领域发展,Python最近一直维持热度,但Python速度,node.js都差距不小,所以使用c++来提高一些速度更有必要。   ...-o hello.so hello.o -lboost_python37 $(pkg-config --cflags --libs python3)   上面的两行编译命令中,有两个编译参数可能需要根据具体版本做调整...,一个pkg-config库管理工具中python3,这个名称和版本号可以检查如下路径配置文件,根据自己需要选择对应库版本,比如python3对应需要有python3.pc文件: ls /usr...libboost_python37.dylib文件,特别注意这个版本同将来运行python环境版本必须精确一致,版本也必须相同: ls /usr/local/lib/libboost_python*...,.o文件为临时文件可以删除,.dylib文件改名为.so文件就是我们需要Python扩展库,使用起来完全相同

1.9K20

【Linux】《how linux work》第十五章 开发工具

本章节在一个空间内提供了大量信息,但你不需要完全掌握这里所有内容。 你可以简单地浏览材料,然后稍后再回来。关于共享库讨论可能你需要了解最重要内容。...C头文件通常包含类型和库函数声明附加源代码文件。例如,stdio.h一个头文件(见第15.1节C编译器中简单程序)。...共享库文件通常存放在与静态库相同位置。 Linux系统上两个标准库目录/lib和/usr/lib。 /lib目录不应包含静态库。...一个名为ld.so(运行时动态链接器/加载器)程序在运行时为程序找到并加载共享库。 前面的ldd输出显示了左侧库名称——这是可执行文件所知道。 右侧显示了ld.so找到库位置。...Beazley(Addison-Wesley,2009)一本很好参考书,书开头还有一个教程,帮助你入门。

9110

宋宝华:一个简单python脚本画出Linux程序库依赖图

在下再接再厉,晚上继续写了一个python脚本,这个脚本完成功能似乎前面的分析函数依赖要cool一些,譬如执行 ..../libdep-pic.py /usr/lib/firefox/firefox 它会得到一个如下效果图,把组件依赖描绘地一目了然: ? 为什么需要这种依赖图? 1....我们想不看源代码搞清楚各个组件关系 2. 我们想分析某个软件有没有依赖GPL而非LGPL库,如果我们想确保应用程序不GPL的话。...原理2:ldd工具,可以列出来elf文件所依赖.so,以及.so依赖.so 譬如: ?...firefox依赖于libm.so.6等,如果我们对libm.so.6继续ldd,就可以分析出更深层次依赖。所以,整个依赖图依赖于递归。 ? 源代码 上述理论基础上,完整源代码高亮后如下: ?

1.4K30

高级语言编译:链接及装载过程介绍

首先最左边这一列变量在所在段相对地址,我们看到 g_a 和 g_c 相对地址相同,这并不冲突,因为他们处于不同段中( D 和 b 表示它们在目标文件中处于不同段中)。...s_a 一个局部静态变量,作用域限制在定义它代码块中,所以我们可以在不同作用域中声明相同名字局部静态变量,比如我们可以在sum函数中声明另外一个 s_a。...当时在目标文件中,同样也是没有地址,我们说这是编译器留给链接器到后面的目标文件中寻找变量定义。但是现在我们检查可执行文件为什么可执行文件里面仍然有这种没有地址 symbols 呢?...一个例子 在明白了编译器如何把我们源代码“转变”成二进制可执行程序之后,我们就能够知道怎么样去看某一段代码被编译成二进制之后一个什么样子,然后就可以按照编译器“习惯”写出高效代码。...但是有经验工程师马上也能看出来,虽然程序1稍显冗余,但是其执行速度程序2 要快为什么快我们从编译器生成目标文件分析一下,我们测试程序如下: 程序1: if(type == 0) { for

1.4K80

动态链接步骤与实现

这4个共享对象的确都被装载进来了,那a1.so函数a和a2.so函数a是不是冲突了呢?为什么main输出结果两个“al.c”呢?也就是说a2.so函数a似乎被忽略了。...:它定义了一个规则,那就是当一个符号需要被加入全局符号表时,如果相同符号名已经存在,则后加入符号被忽略从动态链接器装载顺序可以看到,它是按照广度优先顺序进行装载,首先是main,然后b1.so...所以整个进程中,所有对于符合“a”引用都会被解析到a1.so函数a,这也是为什么main打印出结果两个“a1.c”而不是理想中“alc”和“a2.c”。...但实际上这个问题想象中要复杂,结合全局符号介入,关于调用方式分类解释会更加清楚。...LinuxELF动态链接器Glbc一部分,它源代码位于Glibc源代码elf目录下面,它实际入口地址位于 sysdeps/i386/d1-manchine.h中__start(普通程序入口地址

1.3K20

为什么C代码Python代码运行得更快?

在本文中,我们将了解为什么 C 语言代码 Python 运行得更快。 Guido Van Rossum开发了Python,这是最著名编程语言之一。...几乎总是使用虚拟机来运行Python代码 虚拟计算机另一个名称是“字节码解释器”。 解释代码总是实际机器代码慢,因为它需要更多指令来实现指令,而不是执行实际机器指令。...它是一个包含 Python 源代码 ASCII 文本文件,当您看到带有 extension.py 文件时。 PYthon,编译扩展名为“.pyc”文件所代表。...运行时可以提供运行时服务,例如动态对象加载,并构建代码将在其中执行环境。在编译 C 中,存在运行时。已编译C++具有运行时。 为什么 Python C 慢?...结论 在本文中,我们了解了为什么 C 语言代码执行 Python 更快不同原因。

1.3K30

linux下 lib文件学习思考

说到这个LIB文件,先从一个故障说起。 某日开发说,一台测试用虚机可以PING通SSH不能连了。运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢?...那么在正常相同虚机机器查看下,再和出错虚机比对下,发现少了2个库文件 ? 挂载系统光盘或从正常虚机上把这个两个文件拷贝过来,放到lib64下就可以了 再试正常了 ?...这个故障很容易解决,那么你怎么理解linux中文件呢?学习下也不误工作。...当某个查询第一次被发送到高速缓冲DNS服务器时,高速缓冲DNS服务器就将此查询整个过程记录下来,在一定时期内用它来回答所有相同查询,从而减少整个DNS系统负担并且提高查询速度。 ...最简单直接把.a当成一个普通源代码编译进来.

2.5K20

Linux共享库、静态库、动态库详解

然而,如果一个函数升级了某个函数库而保持了原来soname,你可以强行将老版本函数库拷贝到某个位置,然后重新命名这个文件(例如使用原来名字,然后后面加.orig后缀),然后创建一个“wrapper...这两个文件之间没有真正冲突; GNU标准建议开发人员使用默认源代码,而FHS则建议分销商使用默认值(通常通过系统软件包管理系统来选择覆盖源代码默认值)。...为坏”,以 了解为什么。...他们大多没有文件证明; 如果您需要了解它们,了解它们最佳方式读取装载器源代码(gcc一部分)。 如果不采取特殊措施,允许用户控制动态链接库对于setuid / setgid程序将是灾难性。...但是,如果一个程序中断更新到保持相同soname库,您可以强制它使用旧库版本通过将旧库复制到某个地方,重命名该程序(比如说旧名称加上“.orig ''),然后创建一个“包装器”脚本,该脚本重置库以使用并调用真实

8.8K11
领券