GCC中静态连接和动态连接的区别

GCC中静态连接和动态连接的区别,第1张

gcc中静态连接和动态链接的方法:

1:GCC的静拍明敏态连接,直接把静态库的名字放在gcc后面

例如:gcc -o test test.c staticlib.a

2:GCC的动态连接,使用-l指定库,-L指定库的路径,注意动态库名必须是lib开头,后缀名为.so

例如: gcc -o test test.c -lpthread -L/usr/lib/

3:静态库也可以采用动态库的连接方法,如果目录中同时存在2种库,gcc会优先选择动态库。如果一条gcc链接指令中既要链接动态库又要链接静态库,可以用-Wl,-dn 和-Wl,-dy参数选项来切换。

静态连接和动态链接的主要区别:

1:静态连接的时候,静态库的所有执行代码被直接编译到目标程序中。而动态连接的时候,仅仅把动态库的函数和变量的符号名,地址偏移量等导袭枝入到目标程序。只有在目标程序运行的时候才把动态库的执行代码加载到内存中。

2:动态链接的项目容易管理,把不同模块封装成不同的动态库,如果模块功能修改,一般只需要重新生成该动态库,不用重新编译其他模块和目标程序。而槐耐静态链接的程序修改任何一个地方都必须重新编译整个程序

3:静态链接生成的目标程序体积比动态链接的大,但是加载速度更快,发布更容易,不需要检查发布机器上是否有该动态库或者动态库版本是否符合要求。

4:如果多个程序使用一个动态库,则该库的执行代码只会在内存中加载一次。而静态库是多次加载(事实上静态库连接完就没用了,等于目标程序的一部分)。

5:从调试的角度来说,静态连接的程序调试方法和独立程序没有任何区别,而动态库的调试相对要复杂一些,因为库里面的符号地址都是相对地址

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。

静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。

像Unix ld程序这样的静态链接器(static linker)以一组可重定位的目标文件作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在一个节中;而未初始化的变量在另外一个节中。

动态链接英文是Dynamic Linking,他是使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,从某种意义上来讲大大促进了程序的开发效率,原先限制程序的规模也随之扩大。但是慢慢地静态链接的诸多缺点也逐步暴露出来,比如浪费内存和磁盘空间、模块更新困难等问题,使得人们不得不寻找一种更好的方式来组织程序的模块。

动态链接与静态链接对比

静态链接

优点:

① 代码装载速度快,执行速度略比动态链接库快;

② 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。

缺点:

使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

动态链接

优点:

①更加节省内存并减少页面交换;

② DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用蚂旦约枝枯定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

③不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;

④适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

缺点:

使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如猛物洞果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。[1]

页面

动态页面:含有?的,或是以asp,php,jsp,aspx结尾的都是动态,动态页面是可以通过网站后台管理系统对网站的内容进行更新管理,动态页面在服务器里面不是真实存在的,访问动态页面需要经过数据库,动态页面是动态连接,发布公司产品,交流互动,博客,网上调查等,这都是动态网站的一些功能。

静态链表这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除 *** 作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。

假如有如上的静态链表S中存储着线性表(a,b,c,d,f,g,h,i),Maxsize=11,如图所示,要在第四个元素后插入元素e,方法是:先在当前表尾加入一个元素e,即:S[9].data = e;然后修改第四个元素的游巧判销标域,将e插入到链表中,即:S[9].cursor = S[4].cursor;S[4].cursor = 9,接着,若要删除第7个元素h,则先顺着游标链通过计数找到第7个元素存储位置孝游6,删除的具体做法是令S[6].cursor = S[7].cursor。

扩展资料:

静态链表中,除了数据本身通过游标组成链表外,还需要有一条连接各个空闲位置的链表,称为备用链表。

作用:回收数组中未使用或者之前使用过(现在不用)的存储空间,留待后期使用。即静态链表使用数组申请的物理空间中,存在两个链表,一条连接数据,另一条连接数组中为使用的空间。

注:通常备用链表的表头位于数组下标为0(a[0])的位置,而数据链表的表头位于冲敬数组下标为1(a[1])的位置。

参考资料来源:

百度百科-静态链表


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12467031.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存