设为首页 加入收藏

TOP

Linux编译链接问题----静态库和动态库
2014-11-24 08:37:05 来源: 作者: 【 】 浏览:0
Tags:Linux 编译 链接 问题 ---- 静态 动态

1. Linux静态库和动态库的命名规则:


静态函数库:静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。


a) 优点:编译后,可执行文件不需要外部支持;


b) 缺点:生成的可执行程序大;静态库改变了,就需要重新编译可执行程序。


动态函数库:动态库的名字一般是libxxx.so,相对于静态库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里面相应的函数,因此使用动态函数库生成的可执行文件比较小。由于函数库没有编译进可执行程序,而是程序运行时动态的申请调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变也不会影响可执行程序,针对可执行程序的动态函数库升级也比较容易。


a) 优点:实现进程的资源共享,当程序在运行的时候需要调用某个动态链接库函数时候,OS会先查看所有正在运行的程序,看内存里面是否已经有此函数的拷贝了,有责共享那个拷贝,没有才会链接载入,这样会大大节省OS的内存资源;


b) 优点:升级容易,升级动态链接库即可,不需要重新编译可执行程序;


2. Gcc/g++的编译链接:


通常,对函数的链接是在编译期的时候完成的,所有相关的对象文件与相关联的library被链接成一个可执行文件,这就是使用静态库的编译过程,


而动态库技术:对一些库函数的链接载入推迟到程序运行的时候。


但是,不管是使用静态库还是使用动态库,这些库文件都是由*.o文件生成的,在给编译器gcc传不同的参数,就会生成相应的静态库或者是动态库了。


3. 静态库和动态库的创建过程:


a) 创建静态库:


在linux环境下,创建静态库是使用ar命令,具体的选项可以man查看下,例子:


ar -rt libtest.a error.o show.o test.o


这样就创建了libtest.a静态库文件。


b) 创建动态库:


使用gcc编译.c文件的使用,使用-fPIC标签,然后在使用*.o文件生成动态库文件的时候,传递-shared标签给gcc,例子:


Gcc –fPIC –c file1.c


Gcc -fPIC -c file2.c


Gcc –shared libtest.so file1.o file2.o


这样就创建了libtest.so动态库文件。


4. 使用静态库和动态库的方法:


动态库文件和静态库文件的使用方法基本上差不多,在gcc的command里面使用-Lpath和-lxxx标签:


Gcc file1.o file2.o –Lpath –lxxx –o yourprogrammer


编译器会先到path下面寻找libxxx.so文件,如果没有找到,继续寻找libxxx.a文件。


那么动态库函数文件,是在程序运行的过程中决定是否载入的,那么我们需要告诉编译器,去哪里能找到动态库函数文件,在linux或者类unix操作系统里面是使用LD_LIBRARY_PATH环境变量来实现的。


That’s all。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux 2.6.32的内核栈和用户空间.. 下一篇Linux 2.6 内核软中断(softirq)执..

评论

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

·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)
·想要自学数据分析, (2025-12-27 02:49:14)
·Java 集合框架 - 菜 (2025-12-27 02:19:36)
·Java集合框架最全详 (2025-12-27 02:19:33)