目录
一、什么是静态库
- 静态库(.a):程序在编译链接的时候把库代码链接到可执行文件中
静态库的创建和应用(含例子)
第一步:将各模块编译为.o文件 g++ -c xxx.cpp
第二步:将.o文件打包到静态库当中(libmain.a是创建的静态库名字)
第三步:此时静态库则创建完成,生成可执行文件编译即可
例子:
二、什么是共享库
- 共享库(.so或者.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码
共享库的创建和应用(含例子)
第一步:g++ -fpic -shared -o xxxx.so xxx.cpp
第二步:拷贝到lib库:cp libmain.so /usr/lib (libmain.so是共享库格式)
第三步:链接动态可执行文件:g++ -o amain main.cpp -lmain (amain是共享库链接)
例子:
三、静态库和共享库的区别
- 静态库被程序静态链接于编译时,共享库被动态链接于运行时;
- 静态链接时,需要把所有对静态库的引用内容都嵌入到最终的可执行文件中,且相同模块并不共用,都有相应的副本,因此相应的可执行文件在磁盘和内存中所占空间较大;而动态链接是发生在运行时的,并且是共享的,因此相应的可执行文件在磁盘中所占空间较小;
- 由于静态链接是在编译时完成的,因此可执行文件中以及包含有所需的静态库,可执行文件可以单独运行;由于动态链接是在程序运行时完成的,可执行文件在加载入内存运行时才会链接共享库,因此可执行文件必需共享库的支持,不能单独运行;
- 当静态库中某个模块更新后,需要重新编译链接生成相应的可执行文件;另一方面若共享库中某个模块更新了,只要接口没有改变,就不需要重新编译链接生成可执行文件;
- 静态链接比动态链接速度稍快;
- 静态库中不能包含共享库,而共享库中可以包含静态库。
综合以上区别,可以发现动态链接的性能是明显优于静态链接的,但是这不一定就说明静态链接一定比不上动态链接了。如果库本身就比较小且不经常改变,基于速度的角度,应当选择静态链接,否则还是应当选择动态链接,由于是大型软件需要经常维护、扩展之类的情况。除此之外,静态链接的一个显著优点是其相应的可执行文件已经是完整的,包含所有所需的模块,因此可以很方便地移动到其他地方执行。
补充:main.cpp 内的演示代码(简单的1-100 求和)
源代码
#include<iostream>
int main()
{
int sum=0;
for(int i=1;i<=100;i++)
{
sum += i;
}
std::cout<<sum<<std::endl;
return 0;
}
这边仅仅只是做一个练习,仅供参考