动态库与静态库
1.引用静态库
1.包含头文件
注意: 如果.h文件不在当前工程目录下,则需要指定.h文件路径.
两种方法
方法A
a.右键项目->属性
->C/C++
->常规
->附加包含目录
->编辑
->添加文件夹路径
(精确到最后一级目录)
b.#include “xxx.h”
方法B
a.#include “文件路径名/xxx.h”
2.添加依赖项 , 指定使用哪个 .lib
STEP1
属性
->链接器
->常规
->附加库目录
将.lib文件路径编辑到其中
STEP2
两种方法
方法A
1.#pragma comment(lib,“testlib.lib”)
方法B
1.属性
->链接器
->输入
->附加依赖项
#include <stdio.h>
#include "../testlib/testlib.h"
#pragma comment(lib,"testlib.lib") //注意,在属性设置中仅添加了附加库目录,这里需要指定附加库文件名
2.制作动态库
- 新建空dll项目
- testdll.h头文件编写
#ifndef _TESTDLL_H_
#define _TESTDLL_H_
__declspec(dllexport) //特别声明(以dll方式导出)
int Add_Num(int a,int b);
#endif
- testdll.c编写
#include "testdll.h"
int Add_Num(int a,int b)
{
return a+b;
}
- 重新生成
- 用
dependency
软件查看dll文件 是否有接口
3.使用动态库
- 包含头文件 又叫
导入头文件
- 注意,被导入的头文件中,函数声明前要加__declspec(dllimport)
- 而我们想直接使用dll头文件
- 因此在编辑头文件时,应该加上条件编译
- 动态库头文件代码可以改为:
- 在动态项目中
属性
->C/C++
->预处理器
->预处理器定义
->添加_DLLAPI
- 注意,被导入的头文件中,函数声明前要加__declspec(dllimport)
#ifndef _TESTDLL_H_
#define _TESTDLL_H_
#ifdef _DLLAPI
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif
//__declspec(dllexport) //特别声明(以dll方式导出)
int DLLAPI Add_Num(int a,int b);
#endif
a)隐式调用法
-
属性
->链接器
->附加库目录
增加库目录 -
添加 附加依赖项
两种方法
-
添加
#pragma comment(lib,"testdll.lib")
//这不是静态库,是导入库 -
属性
->链接器
->输入
->附加依赖项
b)动态调用法
-
添加头文件
<windows.h>
-
添加调用代码 :
HMODULE hDLL = LoadLibrary(L"../testdll/Release/testdll.dll");
-
给动态库中的某函数定义别名 :
typedef int (*PADD) (int a,int b);
-
添加获得函数指针代码 :
PADD pADD = (PADD)GetProcAddress(hDLL,"Add_Num");
//寻找函数名为Add_Num的函数,并将其指针赋值给pADD 注意函数名不一定为自己所写,可以使用dependency
查看函数名; -
直接使用函数指针
pADD(10,20);
-
使用完后,使用
FreeLibrary(hDLL);
释放动态库中函数;