天嵌 ARM开发社区

 找回密码
 注册
查看: 4278|回复: 6

Linux静态库和动态库的分析

[复制链接]
wuchguang 发表于 2010-8-26 15:16:17 | 显示全部楼层 |阅读模式
在学习Linux编程过程中,有人还没了解到Linux下静态库与动态库的区别和特质。今天所性将其讲解一下,希望能帮助到各位。

一、基本区别:动态的库后缀名为*.so    静态库的后缀名为*.so
machoe 发表于 2010-8-26 19:34:26 | 显示全部楼层
静态是不是.a啊???
这帖子怎么回事,没写完?
 楼主| wuchguang 发表于 2010-8-27 08:46:56 | 显示全部楼层
2# machoe


是的,帖子还没发完。
 楼主| wuchguang 发表于 2010-8-27 12:03:49 | 显示全部楼层
Linux静态库和动态库的分析

一、基本区别。
        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开发板也是需要使用交叉编译器的,否则库不能正常使用。这点希望大家能理解得了。
123662981 发表于 2011-2-19 13:52:29 | 显示全部楼层
找了好久,之前创建了一个可执行文件,放到arm总是报错——illegal instuction,后来了解到是动态链接的问题。可是如何才能是它变为静态链接呢?是根据qt开发手册上的qt4之hello_cn写的程序
欧阳秋臣 发表于 2013-4-30 15:21:03 | 显示全部楼层
总算找到想要的了 自己试了半天总是用不了静态库。。。呜呜
欧阳秋臣 发表于 2013-4-30 23:33:42 | 显示全部楼层
今天是了下 你发布的linux下编码转换的4.3.3编译的libiconv.a 静态库。。。。实验了下出错。。。上网查了下大概是要更新库才能用。。。。我觉得就是libiconv.a 的静态库没有被正确使用。。。。看了你这个帖子,感觉还是很乱。。。你只是说了arm-linux-gcc 用动态库的方法。。。至于静态库就说的有些模糊了。。。能不能在解释下呢。。。是不是arm-linux-gcc -o YYYY *.c -L. -liconv 就行了呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 04:43 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表