首页 > 代码库 > linux动态库与静态库使用比较

linux动态库与静态库使用比较

在windows下,动态库dll的使用往往伴随着lib的指引,而linux使用动态库和静态库则有较大的不同。

linux静态库和动态库的区别

1. 静态库

        名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,编译后的执行程序不需要外部的函数库支持,但是,升级比较麻烦。每一次版本更新都需要重新编译。

2. 动态库

    名字一般是libxxx.so;动态库没有被编译进最终程序,只有在需要的时候,动态加载到内存中。编译后的程序不包含动态库部分,程序的运行需要动态库的支持,升级方便。

静态库的使用

静态库的操作工具:gcc(g++)和ar 命令。 

编写及使用静态库 

(1)设计库源码test1.cpp和test2.cpp

test1.cpp代码内容如下:

#include<stdio.h>

void bye1() 

                printf("Jack,goodbye\n"); 

test2.cpp代码内容如下:

#include<stdio.h>

void bye2() 

           printf("Tom ,byebye\n"); 

  (2)  编译源文件

$ g++ -O -c test1.cpp test2.cpp  //命令行操作

做完之后 用  ls命令查看是否生成两个test1.o test2.o 文件

(3)  打包静态库 

    为了在编译程序中正确找到库文件,静态库必须按照 lib[name].a 的规则命名,如下例中[name]=test. 

$ ar -rsv libtest.a  test1.o  test2.o //命令行操作,将.o文件打包成libtest.a


$ ls -l *.a //命令行,查看生成的.a文件


$ ar -t libpr.a //查看库文件中包含的文件


(4)  调用库函数代码 main.cpp 

main.cpp中的代码:


#include"test1.cpp"

#include"test2.cpp"

int main() 

                test1(); 

                test2(); 

                return 0; 

(5)  编译链接选项 

    -L 及-l 参数放在后面.其中,-L 加载库文件路径,-l 指明库文件名字. 

$ gcc -o main main.c -L./ -ltest   //生成可执行文件 

(6)执行目标程序 

$ ./main 


动态库的使用

编写动态库 

(1)设计库代码 

设计生成动态库的源文件代码:

dlluse.cpp代码如下:

#include<stdio.h>

void print(){ 

                printf("linux DLLuse  test!\n"); 

   } 


(2)生成动态库 

$ gcc -O -fpic -shared -o dl.so dlluse.cpp //生成动态库

$ ls -l *.so         //查看生成的动态库

态库的隐式调用 (显式比较头疼)

  在编译调用库函数代码时指明动态库的位置及名字,  看下面实例 

调用函数main.cpp:

#include"dlluse.cpp"

int main() 

                print(); 

                return 0; 

$ gcc -o main main.c ./dl.so //链接生成可执行程序

$ ./main   //执行程序

当动态库的位置活名字发生改变时,  程序将无法正常运行;  而动态库取代静态库的好处之一则是通过更新动态库而随时升级库的内容. 


库依赖的查看

使用ldd命令来查看执行文件依赖于哪些库。