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