静态库、动态库、共享库
在使用C/C++编程的时候,我们通常使用.h和.cpp的方式来书写我们的代码,可这存在一个问题:当我们需要将写好的功能分享给别人时候的时候,如果同时把.h和.cpp交给别人势必会造成我们的代码泄漏,静态库和动态库很好地解决了这个问题,即:可以将写好的功能分享给他人,又可以将关键部分代码隐藏。
静态库
Win
生成静态库
- 在VS中创建Win32项目;
- 选择“静态库”项目,取消勾选“预编译头”;
- 修改项目属性,在C/C+±>代码生成->运行库设置成MTd;
- 写完代码编译;
- 在项目文件夹中找到.h和.lib文件,使用时用这两个文件就行;
使用静态库
-
将.h和.lib文件复制到使用的项目文件夹中;
-
项目中将.h文件添加进来;
-
头文件包含.h文件并在代码中添加
1
Linux
生成静态库
-
编译生成.o文件
1
gcc -o xxx.o xxx.c
-
将.o文件打包
1
ar rcs libxxx.a 文件1.o 文件2.o ...
使用静态库
-
查看静态库的相关信息
1
nm libxxx.a
-
使用时在编译命令中加入
1
-I 头文件名.h -L 库名
动态库
Win
生成动态库
-
在VS中创建Win32项目;
-
选择DLL项目;
-
修改项目属性,在C/C+±>代码生成->运行库设置成MTd,预编译头选择不使用预编译头
-
写代码,在每个函数前面加上
1
__declspec(dllexport)
-
编译完成后在项目文件夹中找到.h,.lib,.dll文件,使用时用这三个文件;
使用动态库
-
将.h,.lib,.dll文件复制到使用的项目文件夹中;
-
头文件包含.h文件并在代码中添加
1
Linux
生成动态库(共享库)
-
编译.o文件,要求与位置无关,使用参数 -fPIC;
-
打包成so文件
1
gcc -shared -o libxxx.so xxx.o xxx.o ...
使用动态库(共享库)
- 编译 -L 指定路径,-l指定库名,用法同静态库;
- 执行的时候不能找到动态库,解决办法:
- 拷贝到系统的库路径下,不推荐
- 修改LD_LIBRARY_PATH环境变量,将库所在的路径,添加到环境变量中,用冒号分割
- 修改sudo vi /etc/ld.so.conf ,添加库路径在该文件中,sudo ldconfig -v
静态库和动态库的比较
静态库
- 优点:执行快,发布应用时不需要发布库;
- 缺点:执行程序体积比较大,库变更时需要重新编译应用;
动态库
- 优点:执行程序体积小,库变更时,一般不需要重新编译应用 ;
- 缺点:执行时需要加载动态库,相对而言,比静态库慢,发布应用时需要同时发布动态库;
评论