Chinaunix首页 | 论坛 | 博客
  • 博客访问: 602157
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类:

2011-10-26 10:15:02

Linux静态库和动态库的分析[/b]

一、基本区别。
        Linux下的动态库后缀名为.so  静态库后缀名为.a
二、各自特性。
        使用静态库函数所编译出来的程序,在编译前需要静态库的支持,在编译后则完全不需要静态库就可运行程序。这是因为我们编译过程中连接器直接把调用到静态库 函数的内容拷贝到程序里,这样的特点会使编译出来的程序变大。
        使用动态库函数所编译出来的程序,在编译前需要动态库的支持,在编译后也需要动态库的支持才可运行程序。这是因为我们编译过程中连接器只把调用到动态库函 数的标识位定位到程序里而已。这样的特点会使编译出来的程序很小。

三、如何建立库。
        既然知道了两类库的区别与特性,那我们如何建立这类库呢。
        我们一般得到的是 *.c文件,而这两类库都是*.o文件再生成的。我们要使用如下命令编译不连接成*.o文件;
                gcc -c *.c

        1、建立静态库。
       
        使用如下命令:
                ar -r libXXX.a *.o  注:其中lib是Linux下库名的前缀,XXX才是库名,而.a是库的后缀名,而*.o 是我们使用gcc -c *.c得来的。
       

        2、建立动态库。
       
        使用如下命令:
                gcc -shared -fPCI -o libXXX.so *.o 注:其中lib是Linux下库名的前缀,XXX才是库名,.so是动态库的后缀名,而*.o 是我们使用gcc -c *.c得来的。
        做好动态库之后,我们还要把这个动态库移放到/lib usr/lib 这两个默认动态库目录里。
        再使用chcon -t texrel_shlib_t *.so 设置为安全文档归档。

四、如何使用库。
        建好的库如何使用。
        一般情况。假如我们所编译出来的程序所使用的库不规范,而有时我们的程序要运行在其它机上。我们尽量使用静态库。假如我们所编来的程序所使用的库很规范, 或是不需要运行在其它机上。我们完全有理由使用动态库。具体上还需要根据实况选择。
        1、使用静态库。       
        如果我们要编译的程序源码调用了静态库的函数,我们编译时要如下操作。

                gcc -o YYYY *.c -L. -lXXX         注:YYYY是编译后的程序名,*.c是程序源码,XXX是静态库名(不需要lib .a 前后缀)
        编译后的程序完全可以在其它Pc机Linux平台上运行。

        2、使用动态库。
        如果我们要编译的程序源码调用了动态库的函数,我们编译时要如下操作:

                gcc -o YYYY *.c -L. -lXXX        注:YYYY是编译后的程序名,*.c是程序源码,XXX是静态库名(不需要lib .so 前后缀)
        编译后的程序如要运行到其它机上,要把我们的动态库拷贝到目标机上。

        我们从别人拿到程序后,如果不知道该程序需要什么动态库支持,我们可以使用如下命令查看:
                ldd YYYY        注:YYYY指该程序名。


        以上操作所面对的运行平台都是PC机。如果您的程序是要运行在ARM开发板上平台,请使用交叉编译器编译。
        如:gcc -shared -fPCI -o libXXX.so *.o  交叉编译器的名为 arm-linux-gcc 我们将其改为arm-linux-gcc -shared -fPCI -o libXXX.so *.o 。
        再如:
        ar -r libXXX.a *.o 交叉编译器的名为 arm-linux-ar 我们将其改为arm-linux-ar -r libXXX.a *.o

        如果我们的动态库、静态库要移植到ARM开发板也是需要使用交叉编译器的,否则库不能正常使用。这点希望大家能理解得了。
阅读(342) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~