现在的位置: 首页 > 综合 > 正文

Linux静态库和动态库的分析

2018年05月16日 ⁄ 综合 ⁄ 共 1603字 ⁄ 字号 评论关闭

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开发板也是需要使用交叉编译器的,否则库不能正常使用。这点希望大家能理解得了。


参考:http://www.cnblogs.com/hzh1024n/archive/2009/09/17/1568357.html

抱歉!评论已关闭.