一、静态库和动态库的区别

1. 静态库(.lib)

  • 函数实现和变量的二进制文件
  • 编译链接可执行程序时,静态库会直接展开到文件。
  • 发布可执行程序时,不需要静态库。
  • 编译出的可执行文件较大。

2. 动态库(.dll)

  • windows下动态库一般包含引入库(.lib)文件和动态库(.dll文件)。
  • dll包含函数实现和变量;lib包含该dll的中函数和变量的声明和位置,引入lib库后,就可以找到dll库。
  • 编译链接时只需要lib,程序运行时才动态加载dll,将该dll映射到进程的地址空间中,然后访问dll中导出的函数。
  • 发布时,需要携带lib和dll文件。
  • 编译出的可执行文件较小。

二、动态库的使用

1. 隐式链接

需要.h,lib库,dll库。lib库只在编译用,dll库在运行时用

1.1 (方法一)在VS中配置

比较繁琐,建议方法二

1.1.1 .h库引用

工程属性—>VC++目录—>包含目录—>选择.h所在目录

iOS动态库代码混淆 动态库lib_c++

1.1.2 lib库引用

(1)工程属性—>VC++目录—>库目录—>选择lib所在目录

iOS动态库代码混淆 动态库lib_c++_02


(2)在链接时,也需要lib库

工程属性—>链接器—>输入—>附加依赖项

iOS动态库代码混淆 动态库lib_windows_03

1.1.3 dll库引用

我一般就直接配置环境变量了,当然也可以在VS配置dll工作目录,方法如下

(1)工程属性—>VC++目录—>可执行文件目录—>选择可执行目录

iOS动态库代码混淆 动态库lib_windows_04


(2)配置dll目录,工程属性—>VC++目录—>可执行文件目录—>选择可执行目录

iOS动态库代码混淆 动态库lib_visual studio code_05

Windows查找dll库的顺序:

  • exe文件所在的目录下;
  • 进程当前的工作目录;
  • Windows系统目录;
  • Windows目录;
  • 环境变量Path下的一系列目录

1.2 (方法二)最简单的办法

(1)添加lib库,工程属性—>VC++目录—>库目录—>选择lib所在目录(或者直接在代码里写#pragma comment(lib, “Lib.lib”)

#include "stdafx.h"
#include "DLLSample.h"

#pragma comment(lib, "DLLSample.lib")    

int main()
{
        TestDLL(123);   //dll中的函数,在DllSample.h中声明
        return(1);
}

(2)添加.h头文件,工程属性—>VC++目录—>包含目录—>选择.h所在目录
(3)将dll库放入项目目录

2. 显示链接

如果只有dll库,则只能进行显示链接

  • 使用Windows API的LoadLibrary函数,将DLL模块映像到进程的内存空间,对dll模块进行动态加载。
  • 使用GetProcAddress函数得到要调用dll中的函数的指针。
  • 不用dll时,使用FreeLibrary函数或从进程的地址空间显式卸载dll。
#include <iostream>
#include <windows.h>         //使用函数和某些特殊变量

typedef void (*DLLFunc)(int);

int main()
{
        DLLFunc dllFunc;
        HINSTANCE hInstLibrary = LoadLibrary("DLLSample.dll");//可以使用dll库的绝对路径,否则将会按照windows搜索方式进行搜索

        if (hInstLibrary == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
        if (dllFunc == NULL)
        {
          FreeLibrary(hInstLibrary);
        }
        dllFunc(123);
        std::cin.get();
        FreeLibrary(hInstLibrary);
        return(1);
}

三、静态库的使用

  • 静态库lib文件是多个obj文件的集合,obj文件是cpp文件编译生成的
  • lib文件包含了链接库的所有信息(函数代码和接口信息)
  • 只需要.h文件和lib文件

1. 添加lib

方式与动态库相同

2. 添加.h

方式与动态库相同

参考:基础:windows下lib和dll的区别和使用