在使用C/C++编程的时候,我们通常使用.h和.cpp的方式来书写我们的代码,可这存在一个问题:当我们需要将写好的功能分享给别人时候的时候,如果同时把.h和.cpp交给别人势必会造成我们的代码泄漏,静态库和动态库很好地解决了这个问题,即:可以将写好的功能分享给他人,又可以将关键部分代码隐藏。

静态库

Win

生成静态库

  1. 在VS中创建Win32项目;
  2. 选择“静态库”项目,取消勾选“预编译头”;
  3. 修改项目属性,在C/C+±>代码生成->运行库设置成MTd;
  4. 写完代码编译;
  5. 在项目文件夹中找到.h和.lib文件,使用时用这两个文件就行;

使用静态库

  1. 将.h和.lib文件复制到使用的项目文件夹中;

  2. 项目中将.h文件添加进来;

  3. 头文件包含.h文件并在代码中添加

    1
    #pragma comment(lib,"xxx.lib")//文件名.lib

Linux

生成静态库

  1. 编译生成.o文件

    1
    gcc -o xxx.o xxx.c
  2. 将.o文件打包

    1
    ar rcs libxxx.a 文件1.o 文件2.o ...

使用静态库

  1. 查看静态库的相关信息

    1
    nm libxxx.a
  2. 使用时在编译命令中加入

    1
    -I 头文件名.h -L 库名

动态库

Win

生成动态库

  1. 在VS中创建Win32项目;

  2. 选择DLL项目;

  3. 修改项目属性,在C/C+±>代码生成->运行库设置成MTd,预编译头选择不使用预编译头

  4. 写代码,在每个函数前面加上

    1
    __declspec(dllexport)
  5. 编译完成后在项目文件夹中找到.h,.lib,.dll文件,使用时用这三个文件;

使用动态库

  1. 将.h,.lib,.dll文件复制到使用的项目文件夹中;

  2. 头文件包含.h文件并在代码中添加

    1
    #pragma comment(lib,"xxx.lib")//文件名.lib

Linux

生成动态库(共享库)

  1. 编译.o文件,要求与位置无关,使用参数 -fPIC;

  2. 打包成so文件

    1
    gcc -shared -o libxxx.so xxx.o xxx.o ...

使用动态库(共享库)

  1. 编译 -L 指定路径,-l指定库名,用法同静态库;
  2. 执行的时候不能找到动态库,解决办法:
    • 拷贝到系统的库路径下,不推荐
    • 修改LD_LIBRARY_PATH环境变量,将库所在的路径,添加到环境变量中,用冒号分割
    • 修改sudo vi /etc/ld.so.conf ,添加库路径在该文件中,sudo ldconfig -v

静态库和动态库的比较

静态库

  1. 优点:执行快,发布应用时不需要发布库;
  2. 缺点:执行程序体积比较大,库变更时需要重新编译应用;

动态库

  1. 优点:执行程序体积小,库变更时,一般不需要重新编译应用 ;
  2. 缺点:执行时需要加载动态库,相对而言,比静态库慢,发布应用时需要同时发布动态库;