后缀(.lib .a),是一个包含编译好的目标文件(.obj/.o 文件)的归档文件包。
编译时链接: 关键特征在于它是在程序编译和链接阶段被处理的
程序(.exe/另一个库)链接静态库时,----->扫描静态库找
.obj/.o
文件----->提取合并到最终程序或目标库
直接包含头文件,链接文件
不需要复杂的加载或依赖
新建项目---选择控制台应用---配置创建
右键项目--添加--添加引用
引用.h文件--所有配置--所有平台--配置c/c++常规----附加包含添加目录
就可以使用引入的库了
· 在代码中语句加载lib调用
需要将.lib链接到主程序
#pragma comment(lib,"lib/StaticLib1.lib")
添加.h文件
#pragma comment(lib,"lib/StaticLib1.lib")
#include "externalUse.h" //必须包含头文件
项目依赖作用是确保在构建主项目时先构建依赖项目(控制编译顺序),
项目引用主项目不仅知道依赖,还会自动链接 .lib
文件(控制链接阶段)
DLL 是一种共享库机制(Dynamic Link Library),本质上是包含可执行代码和数据的二进制文件(
.dll
后缀)。不同于程序主文件(EXE),它本身不能独立运行(DllMain
是初始化的入口点),必须由 EXE 或 其他 DLL 在运行时动态加载和调用。
新建项目-->选择动态链接库——>项目配置创建
添加头文件和源文件 --->添加预处理定义设置
#pragma once
#define DLL_API
#ifdef DLL_API
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif // DLL_API
class DLL_API externalUse
{
public:
externalUse();
~externalUse();
int add(int a, int b);
int subract(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);
};
#pragma once
#include "pch.h"
#include "externalUse.h"
externalUse::externalUse(){
}
externalUse::~externalUse() {
}
int externalUse::add(int a, int b){
return a + b;
}
int externalUse::subract(int a, int b){
return a - b;
}
int externalUse::multiply(int a, int b){
return a * b;
}
int externalUse::divide(int a, int b){
return a / b;
}
创建类,导出类成员
配置导出路径(项目--属性--路径)
点击项目--生成解决方案
生成动态库得到如下文件
隐式链接
#include包含声明导出函数头文件
项目设置(Linker - Input - Additional Dependencies)中添加 .lib(导入库)。
便于使用
显性链接
按需加载
静态库(.lib)与动态库(.dll/.so)区别:
- 静态库:编译/链接时,库代码被直接复制并合并到最终 EXE 文件中。
- 动态库:编译/链接时只记录引用信息(函数名、位置);代码在运行时由操作系统加载器动态加载。
导入库(.lib - 用于隐式链接): 一个小的辅助库,包含:1)告诉链接器该 DLL 存在哪些导出符号;2)包含少量跳转到 DLL 实际函数的存根代码。不包含 DLL 的实际功能代码。
头文件(.h): 包含函数声明、类定义、宏、常量等,告诉调用者如何使用 DLL 的接口。
同静态库一样
项目 | 功能 |
---|---|
C/C++ | 附加目录配置.c .h路径 |
链接器输入 | 添加.dll所在路径 |
链接器常规 | 附加路径添加.lib |