静态库和动态库简介
静态库和动态库的定义
从源文件生成可执行文件:预处理、编译、汇编和链接
为了方便复用,可将一些程序编译成库文件,需要时直接链接。库是一种可执行的二进制文件。
静态库(.a, .lib)
静态链接:在链接阶段,编译器将汇编成的目标文件与库文件一起链接打包到可执行文件中。
静态链接库的创建
visual studio
新建 win32项目(取名为testlib),选静态库新建头文件
testlib.h
源文件
testlib.cpp
编译生成
目录如下:
- testlib
- testlib
- Debug
- testlib.lib(为二进制文件不能独立运行)
- testlib.cpp
- testlib.h
- …
- Debug
- testlib
如何应用
新建一个控制台CPP项目test
新建test.cpp
- testlib
-
Debug
-
testlib (这里是testlib项目的工作目录)
- Debug
- testlib.lib(为二进制文件不能独立运行)
- testlib.cpp
- testlib.h
- …
- Debug
-
test (这里是test项目的工作目录)
- Debug
- test.cpp
- …
-
在test.cpp文件中引用 testlib.h
#include "../testlib/testlib.h"
其中../
代表上级目录 , ./
代表当前目录
仅包含头文件 编译不通过。因为头文件仅有申明函数,实现在cpp文件,或者静态库
需要在test项目–>属性–>链接器–>常规–>附加库目录–>输入:
../Debug
发布静态库
新建一个文件夹
- testlib
- include
- testlib.h
- lib
- testlib.lib
- include
动态库
动态库在程序编译的时候不会链接到目标代码中,在程序运行是才被载入。
下载 denpendency 软件 denpendency官网
新建动态库项目
用visual studio新建 win32项目(取名为testdll),选DLL
新建头文件testdll.h
新建源文件testdll.cpp
编译生成会显示 无法启动程序(因为无法独立运行),重新生成就好了
目录如下
- testdll
- Debug
- testdll.dll
- testdll.ilk
- testdll.pdb
- testdll
- Debug
- testdll.cpp
- testdll.h
打开工具denpendency 把文件testdll.dll拖进去
- Debug
红色画圈的地方显示为空。
而正常的,例如系统提供的kernel32.dll(系统核心动态库,线程进程等)这里则会显示导出的接口
要显示导出的接口要在函数前面写
__declspec(dllexport)
目录如下
- testdll
- Debug
- testdll.dll
- testdll.lib
- testdll.ilk
- testdll.pdb
- testdll
- Debug
- testdll.cpp
- testdll.h
- Debug
调用动态库
- 方法一 隐式调用动态库:
在新建的cpp文件中写-
导入头文件
include "../testdll/testdll.h"
-
__declspec(dllimport)
或者``__declspec(dllimport) int add(int a, int b)` -
或者修改testdll.h文件,定义宏
#define DLLAPI __declspec(dllexport)
-
需要在test项目–>属性–>链接器–>常规–>附加库目录–>输入:
../Debug
- 方法二动态调用