[C++] 静态链接库和动态链接库的区别

静态链接库和动态链接库的区别

一、静态链接库

预编译->编译->汇编->链接

Linux:

生成目标文件

g++ -c source.cpp -o source.o

打包成静态链接库

ar -crv source.a source.o

使用静态链接库

g++ test.cpp -L静态链接库目录 -l静态链接库名称没有后缀

二、动态链接库

使用动态链接库是为了规避静态链接库的两个问题。

一个是多个副本的问题,对于静态库都是在编译时刻将其编译到源代码当中,在运行时刻不会再和静态库有任何关系。这样的好处是快,但是造成了空间的浪费

另一个是发布的一致性问题和更新问题,如果是静态库,如果对静态库进行了更新,那么需要重新编译代码,并且提示用户进行下载整个软件,这样会造成很多不变,浪费大量带宽。如果是动态库,只需要更新相应的动态链接库即可,整个软件不需要修改。

Linux平台:

生成目标文件

g++ -fPIC source.cpp -o source.o

动态链接库

g++ -shared source.so source.o

或者合并为一个命令

g++ -fPIC -shared source.so source.cpp

关于在使用中定位动态链接库的位置,需要注意一些问题,默认动态链接库是在/lib 或者 /usr/lib之下的

如果要在其他文件夹之下,需要修改 /etc/ld.so.cache文件

[1] http://www.cnblogs.com/skynet/p/3372855.html