一、静态链接库
- 配置项目属性
(默认的配置类型:应用程序.exe)
- 编写代码,Debug模式下编译项目—生成静态链接库
静态生成的.lib既包含相关的符号链接,也包含实际代码
- 新建项目,在新项目中导入静态链接库
方法一:使用 extern在外部定义,使用#pragma comment(lib,“XXX.lib”)//将库链接
#include <iostream>
extern int add(int a, int b);//外部定义add()
#pragma comment(lib,"Project2.lib")//将库链接
int main()
{
std::cout<<add(1, 2);
return 0;
}
方法二:使用 extern在外部定义,配置项目属性-链接器-输入-XXX.lib
#include <iostream>
extern int add(int a, int b);//外部定义add()
//#pragma comment(lib,"Project2.lib")//将库链接
int main()
{
std::cout<<add(1, 2);
return 0;
}
二、动态链接库的使用
- 配置项目属性
- 生成动态链接库
extern "C" _declspec(dllexport) int add(int a, int b)//(dllexport)导出;"c"以C文件形式
{
return a + b;
}
3. 使用动态链接库
方法一:同时使用静态链接库和动态库,使用XXX.lib(动态生成的.lib只包含相关的符号链接,实际代码没有)
#include <iostream>
extern "C" _declspec(dllimport) int add(int a, int b);
#pragma comment(lib,"DynamicDll.lib")
int main()
{
return add(2, 4);
}
还需要将生成的dll文件拷贝到项目的debug目录下
方法二:不依赖静态库,直接使用动态库方法—利用Windows API
#include <iostream>
//1.将动态库加载到内存中
#include <Windows.h>
int main()
{
//2.dll当前的实例
HINSTANCE hDll = LoadLibrary("DynamicDll.dll");//参数:和项目debug同级:文件名;或者文件所在路径
if (hDll == NULL)
{
std::cout << "load dll fail";
return -1;
}
//3.创建函数指针
using functionPtr = int(*)(int, int);
//4.从加载的实例中找到add()
functionPtr addFunction = (functionPtr)GetProcAddress(hDll, "add");
if (addFunction == NULL)
{
std::cout << "cannot find target function";
return -1;
}
std::cout << addFunction(2, 4);
return 0;
}