静态链接库VS动态链接库
静态链接库与动态链接库都是共享代码的方式。
静态链接库
- 包含:头文件 .h 、静态库 .lib
- .lib包含了实际执行代码、符号表等等。
- .lib中的指令都全部被直接包含在最终生成的 EXE 文件中。
- 静态链接库中不能再包含其他的动态链接库或者静态库。
- 对函数库的链接是放在编译时期完成的。
- 程序在运行时与函数库没有瓜葛,移植方便。
- 浪费空间和资源。
动态链接库
- 包含:头文件 .h 、导入库 .lib 、动态库 .dll
- 其实际的执行代码位于.dll中,.lib只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
- .dll不必被包含在最终exe文件中,exe文件执行时可以“动态”地引用和卸载这个与 exe独立的dll文件。
- 动态链接库中还可以再包含其他的动态或静态链接。
- 将库函数的链接载入推迟到程序运行时期。
- 可以实现进程间的资源共享(因此也称为共享库)。
- 将一些程序升级变得简单。
- 可以真正的做到链接载入完全由程序员在程序代码中控制(显示调用)。
静态链接库的生成
关键点:配置类型 –> 静态库(.lib)
具体方法如下:
新建一个工程
创建头文件:staticTest.h
int add(int a,int b);
- 创建源文件:staticTest.cpp
#include "staticTest.h"
int add(int a,int b){
return a+b;
}
修改配置类型属性,注意编译时配置的属性(debug还是release,win32还是win64)决定生成的库文件是什么类型。
编译,生成的 myStaticLibTest.lib 库文件位于解决方案的debug或release文件夹中。
静态链接库的使用
调用方法一
- 创建新项目,将库文件 myStaticLibTest.lib 和 staticTest.h 头文件copy到项目目录下(存放源文件的地方)
- 创建源文件:testLib.cpp
#include "staticTest.h" //包含头文件
#pragma comment(lib, "myStaticLibTest.lib") //连接库文件
#include<stdlib.h>
#include<stdio.h>
#define namespace std;
void main(int argc, char* argv[]){
printf("a+b=%d\n",add(1,2));
system("pause");
}
注意:myStaticLibTest.lib 和 staticTest.h也可以放到别的地方,只需要在程序中加上相对或绝对路径即可,如:”../myLib/myStaticLibTest.lib”(”.”指同级目录,”..”指上一级目录)
调用方法二
- 创建新项目,将库文件 myStaticLibTest.lib 和 staticTest.h 头文件copy到”solution/mylib”(可随意指定)目录下。
指定头文件所在目录:包含目录,库文件所在目录:库目录(可写相对或绝对路径)。
添加链接库:附加依赖项
创建源文件:testLib.cpp
#include "staticTest.h" //包含头文件
#include<stdlib.h>
#include<stdio.h>
#define namespace std;
void main(int argc, char* argv[]){
printf("a+b=%d\n",add(1,2));
system("pause");
}
动态链接库的生成
关键点:配置类型 –> 动态库(.dll)
具体方法如下:
- 新建一个工程:myDynamicLibTest
- 创建头文件:dynamicTest.h
/***************
下面一段的作用是使"生成dll的项目"和"调用dll的项目"都可以使用同一个头文件:dynamicTest.h 。
__declspec(dllexport),生成dll的项目用于导出(函数 变量 类等)。
导出变量: __declspec(dllexport) int a;
导出函数: __declspec(dllexport) void a();
导出类 : class __declspec(dllexport) a{};
__declspec(dllexport),调用dll的项目中用于导入(函数 变量 类等)。
***************/
#ifdef DLL_EXPORTS
#define MYDLL_EXPORT __declspec(dllexport)
#else
#define MYDLL_EXPORT __declspec(dllimport)
#endif
MYDLL_EXPORT int add(int a,int b);//显示调用最好在前头加上extern “C” 变为C标准编译,可杜绝C++的重载
- 创建源文件:dynamicTest.cpp
//DLL_EXPORT宏定义要位于包含dynamicTest.h之前,这个宏也可以在预处理器中添加,如下图。
#define DLL_EXPORTS
#include "dynamicTest.h"
int add(int a,int b){
return a+b;
}
- 修改配置类型属性,注意编译时配置的属性(debug还是release,win32还是win64)决定生成的库文件是什么类型。
- 编译,生成的 myStaticLibTest.lib 和 myStaticLibTest.dll 文件位于解决方案的debug或release文件夹中。
动态链接库的使用
动态链接库的使用和静态链接库类似,唯一不同的是需要将myStaticLibTest.dll文件和项目编译生成的执行文件:.exe文件放在一起,一般位于解决方案的debug或release文件夹中。