静态库(Static Library)是一种预先编译好的程序代码集合,以独立文件形式存在,供其他程序在编译时链接使用。它将多个目标文件(.o 或 .obj)打包为单一文件,简化了程序开发和部署流程。
.lib
为扩展名.a
(archive)扩展名使用vs2022选择C++
的静态库
创建
写完代码,点击生成即可生产.lab
文件
属性
>C/C++
>附加包含目录
将头文件目录配置上去属性
>链接器
>常规
>附加库目录
配置其所在路径属性
>链接器
>输入
>附加依赖项
配置其名字#include <StaticLib.h>
先把需要引用的头文件还有.lib
文件放在一起
//第一行是引用头文件
//第二行是引用静态库
#include "C:\\Users\\徐加冠\\source\\repos\\LabTest\\x64\\Debug\\StaticLib.h"
#pragma comment(lib,"C:\\Users\\徐加冠\\source\\repos\\LabTest\\x64\\Debug\\StaticLib.lib")
动态库(Dynamic Library)是一种在程序运行时才被链接和加载的共享库文件,包含可被多个程序同时使用的代码和数据。与静态库(Static Library)在编译时被完整嵌入到可执行文件中不同,动态库在运行时才被动态加载到内存,实现代码复用并减少内存占用。
.dll
(Dynamic Link Library)为扩展名。.so
(Shared Object)或 .dylib
(Dynamic Library)为扩展名。头文件的导出语句
#pragma once
#ifndef BHDLL_d
#define BHDLL_d
//宏定义导出
#ifdef BHDLL__//如果没有定义DLLH 就定义 DLLH __declspec(dllexport)
#define BHDLL __declspec(dllexport)//导出
#else
#define BHDLL __declspec(dllimport)//导入
#endif // DLLH__//如果没有定义DLLH 就定义 DLLH
//编写代码区域
//导出函数
BHDLL int add(int a, int b);
BHDLL int sub(int a, int b);
//导出类
class BHDLL dllH
{
public:
int mul(int a, int b);
int div(int a, int b);
};
//以C语言方式导出函数:
extern "C"
{
BHDLL int Cadd(int a, int b);
BHDLL int Csub(int a, int b);
}
#endif
源文件代码
#include "BH_dll.h"
#include <iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int dllH::mul(int a, int b)
{
return a * b;
}
int dllH::div(int a, int b)
{
return a / b;
}
int Cadd(int a, int b)
{
return a + b;
}
int Csub(int a, int b)
{
return a - b;
}
点击重新生成,即可生成动态链接库
#include "iostream"
void fun1()
{
std::cout << "fun1" << std::endl;
}
void fun2()
{
std::cout << "fun2" << std::endl;
}
LIBRARY "test"
EXPORTS
fun1
fun2
LIBRARY "test"
定义的名字要一致链接器
>输入
>模块定义文件
C\C++
>附加包含目录
,改成需要调用dll所在目录链接器
>常规
>附加库目录
链接器
>输入
>附加依赖项
输入调用名字#include "D:\\桌面\\x64\\Debug\\DllMy.h"
#pragma comment(lib,"D:\\桌面\\x64\\Debug\\DllMy.lib")
HINSTANCE Dll = LoadLibrary(L"test.dll");
if (Dll == NULL) {
std::cerr << "无法加载DLL! 错误码: " << GetLastError() << std::endl;
return 1;
}
typedef void (*Func)(); // 定义函数指针类型
Func add = (Func)GetProcAddress(Dll, "fun1");
add();
FreeLibrary(Dll);
return 0;
ps:如果使用导出语句生成的dll,dll内部的函数名称和你定义的不一样,如果使用edf文件导出可以自定义函数名称