GCC动态与静态链接的编译.docx

GCC动态与静态链接的编译.docx

ID:59255157

大小:11.54 KB

页数:6页

时间:2020-09-08

GCC动态与静态链接的编译.docx_第1页
GCC动态与静态链接的编译.docx_第2页
GCC动态与静态链接的编译.docx_第3页
GCC动态与静态链接的编译.docx_第4页
GCC动态与静态链接的编译.docx_第5页
资源描述:

《GCC动态与静态链接的编译.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、GCC动态链接与静态连接的编译根据链接时期的不同,库又有静态库和动态库之分,有别于静态库,动态库的链接是在程序执行的时候被链接的。1库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)2静态库和动态库的比较链接静态库其实从某种意义上来说也是一种粘

2、贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bu

3、g或要升级也很简单,只要用新的库把原来的替换掉就行了。那么,是不是静态库就一无是处了呢?答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相

4、对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。动态链接库1.创建动态链接库代码如下:#includevoidhello(){printf("helloworld/n");}用命令gcc-sharedhello.c-olibhello.so编译为动态库。可以看到,当前目录下多了一个文件libhello.so。2.再编辑一个测试文件test.c,内容如下代码如下:#includeintmain(){printf("callh

5、ello()");hello();}编译gcctest.c-lhello-l选项告诉编译器要使用hello这个库。奇怪的地方是动态库的名字是libhello.so,这里却使用hello.但这样还不行,编译会出错。Infunction`main':test.c:(.text+0x1d):undefinedreferenceto`hello'collect2:ldreturned1exitstatus这是因为hello这个库在我们自己的路径中,编译器找不到。需要使用-L选项,告诉hello库的位置gcctest.c-lhello-L.-ote

6、st-L.告诉编译器在当前目录中查找库文件3.编译成功后执行./test,仍然出错说找不到库有两种方法:一、可以把当前路径加入/etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行)。二、把当前路径加入环境变量LD_LIBRARY_PATH中当然,如果你觉得不会引起混乱的话,可以直接把该库拷入/lib,/usr/lib/等位置(无可避免,这样做也要有权限),这样链接器和加载器就都可以准确的找到该库了。我们采用第二种方法:exportLD_LIBRARY_PATH=.:$LD

7、_LIBRARY_PATH这样,再执行就成功了。下面再讲讲静态链接库仍使用刚才的hello.c和test.c。1.gcc-chello.c注意这里没有使用-shared选项2.把目标文件归档ar-rlibhello.ahello.o程序ar配合参数-r创建一个新库libhello.a并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数-r将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。3.在程序中链接静态库gcctest.c-lhello-L.-static-ohello.static或者gcctest.c

8、libhello.a-L.-ohello.static生成的hello.static就不再依赖libhello.a了两个有用的命令file程序是用来判断文件类型的,在file命令下,所有文件都

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。