首页
学习
活动
专区
工具
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 结论 通过实验证明了: 在相同算法下,...任何两个内容相同的文件的摘要值都是相同的,和路径、文件名、文件类型无关。 文件的摘要值会随着文件内容的改变而改变。

2K30

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

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

82710
  • 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.4K41

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

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

    59220

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

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

    80520

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

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

    98130

    代码 | 自适应大邻域搜索系列之(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框架定制而来的。

    77420

    代码 | 自适应大邻域搜索系列之(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框架定制而来的。

    55621

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

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

    80331

    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)是一本很好的参考书,书的开头还有一个小教程,帮助你入门。

    11110

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

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

    1.4K80

    宋宝华:一个简单的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

    动态链接的步骤与实现

    这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”。...但实际上这个问题比想象中要复杂,结合全局符号介入,关于调用方式的分类的解释会更加清楚。...Linux的ELF动态链接器是Glbc的一部分,它的源代码位于Glibc的源代码的elf目录下面,它的实际入口地址位于 sysdeps/i386/d1-manchine.h中的__start(普通程序的入口地址

    1.4K20

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

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

    1.4K30

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

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

    8.9K11

    linux下的 lib文件的学习思考

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

    2.7K20
    领券