设为首页 加入收藏

TOP

Linux下链接动态库静态库的理解
2014-11-24 01:25:47 来源: 作者: 【 】 浏览:2
Tags:Linux 链接 动态 静态 理解

Linux程序GCC编译基本过程


一个程式从原始码到可执行文件(或共享库文件),一般都要经过预处理、编译、汇编和链接这四个步骤。


编译过程扫描头文件的搜索路径顺序


gcc 在编译时如何去寻找所需要的头文件 :


※所以header file的搜寻会从-I开始


※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH


※再找内定目录


/usr/include


/usr/local/include


/usr/lib/gcc-lib/i386-linux/2.95.2/include


/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3


/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include


库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是


/usr/include


prefix/include


prefix/xxx-xxx-xxx-gnulibc/include


prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include


尤其注意链接过程是本文要重点讨论的:


链接步骤要经历链接内部库(即当前程序源码编译而成的.a,.o,.so)和外部库(依赖的外部静态lib.a、动态库lib.so)


外部库


外部库有两种: (1)静态连接库lib.a


       (2)共享连接库lib.so


共同点:


.a, .so都是.o目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连接时会被最终的可执行文件用到。


区别:


静态库.a : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中。


共享库.so : 与共享库连接的可执行文件只包含它需要的函数的表,而不是所有的函数代码,在程序执行之前,那些需要的函数代码被拷贝到内存中,这样就使可执行文件比较 小,节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用)。共享库还有个优点:若库本身被更新,不需要重新编译与 它连接的源程序。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在C++中使用Lambda函数提高代码性.. 下一篇C/C++知识:Linux终端设置编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: