C++windows内核编程笔记day11 win32静态库和动态库的使用
静态库:
源代码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB
动态库: 函数被程序或其他动态库调用,被调用时,代码只有1份,文件后缀.DLL静态库(C语言):
创建时,选择文本类型文件,输入Clib.c,设置输出路径 ../lib/Clib.lib
int Clib_add(int a,int b)
{
return a+b;
}
同一上工作区,建立控制台程序(.c文件)调用静态库:
#include STDIO.H
#pragma comment(lib,"../lib/Clib.lib") //包含静态库文件
//可以在 工程-设置-连接-对象/库模块 中加入静态库相对地址 ../lib/Clib.lib
int main()
{
int sum=Clib_add(12,34);
printf("12+34 结果是:%d\n",sum);
return 0;
}
C++程序调用C++静态库,与C中大部分一样,但调用之前,要写函数声明。
C++程序调用C静态库,写函数声明时,前面加 extern "C".
使用静态库示例:
新建 win32 static library工程(Clib):
新建一个文件,Clib.c,代码:
int Clib_add(int a,int b) return a+b; int Clib_sub(int a,int b) return a-b; }生成,产生一个 Clib.lib文件。
新建C控制台程序,使用静态库,代码:
#include STDIO.H #pragma comment(lib,"../lib/Clib.lib") //包含静态库文件 //可以在 工程-设置-连接-对象/库模块 中加入静态库相对地址 ../lib/Clib.lib int main() int sum=Clib_add(12,34); printf("12+34 结果是:%d\n",sum); return 0;
(项目:Cdll):
在函数前加 _declspec(dllexport),声明方式导出动态库函数地址到.lib。
生成的.dll和.lib(.lib要手动复制到lib文件夹)。
C程序调用:
#pragma comment(lib,"../lib/Cdll.lib")//函数地址文件
//在运行时,Cdll.dll文件要放在与程序同一目录中或系统PATH目录中
//(隐式链接动态库dll)
C++程序调用C++动态库,与C中大部分一样,但调用之前,要写函数声明。
C++程序调用C动态库,写函数声明时,前面加 extern "C".
显式链接dll的方法(不使用lib文件,要建立.def文件):
1.定义函数指针类型
2.加载动态库
3.获取函数地址
4.使用函数
5.卸载动态库
.def文件格式:
LIBRARY CPPdll
EXPORTS
CPPdll_add @1
CPPdll_sub @2
CPPdll_multi @3
示例:
新建动态库Cdll项目,win32 Dynamic-link library
新建一个Cdll.c文件,内容:
_declspec(dllexport) int Cdll_add(int a,int b) return a+b;新建一个c控制台程序,使用动态库,内容:
#include STDIO.H #pragma comment(lib,"../lib/Cdll.lib")//函数地址文件 //.dll文件要放在与程序同一目录中 int main() int sum=Cdll_add(34,56); printf("34+56=%d\n",sum); return 0;
C++中使用示例:
//CPPdll项目中:
//CPPdll.cpp
_declspec(dllexport) int CPPdll_add(int a,int b) return a+b; }//CPPdll.def
LIBRARY CPPdll EXPORTS CPPdll_add @1编译生成dll和lib,
新建测试项目调用CPPdll和Cdll
#include STDIO.H #pragma comment(lib,"../lib/CPPdll.lib")//C++调用c++的动态库 #pragma comment(lib,"../lib/Cdll.lib")//c++调用c的动态库 extern "C" _declspec(dllexport) int Cdll_add(int a,int b); _declspec(dllexport) int CPPdll_add(int a,int b); int main() int sum=CPPdll_add(23,45); printf("23+45=%d\n",sum); int sum2=Cdll_add(231,45); printf("231+45=%d\n",sum2); return 0;
附:显示调用CPPdll
#include STDIO.H
#include WINDOWS.H
//动态库加.def 文件申明函数地址
typedef int(*DLL_ADD)(int a,int b);//函数类型
int main()
{
HINSTANCE dll= LoadLibrary("CPPdll.dll");//加载动态库
DLL_ADD add=(DLL_ADD)GetProcAddress(dll,"CPPdll_add");
int sum=add(23,45);
printf("23+45=%d\n",sum);
FreeLibrary(dll);
return 0;
}
动态库中的类定义:
//dllclass.h文件,可以公开给调用方
#ifndef DLLCLASS_H
#define DLLCLASS_H
#ifdef DLLCLASS_EXPORTS //在动态库.cpp中要定义,来表示导出
#define EXT_CLASS _declspec(dllexport) //cpp文件使用,导出
#else
#define EXT_CLASS _declspec(dllimport) //别人调用,导入
#endif
class EXT_CLASS CMath
{
public:
int add(int a,int b);
};
#endif
//dllclass.cpp文件
#define DLLCLASS_EXPORTS
#include WINDOWS.H
#include STDIO.H
#include "dllclass.h"
//动态库入口函数,返回false则表示调用不成功
BOOL CALLBACK DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH://进程加载,初始化
{
printf("loading dll ……\n");
}
break;
case DLL_PROCESS_DETACH://进程卸载,清理资源
{
printf("unloading dll ……\n");
}
break;
}
return true;
}
int CMath::add(int a,int b)
{
return a+b;
}
//调用
#include "../dllclass/dllclass.h"//包含类声明文件
#pragma comment(lib,"../lib/dllclass.lib") //包含静态库文件
int main()
{
CMath math;
int sum3=math.add(3,4);
cout "3+4 结果是:" sum3 endl;
return 0;
}
AcWing语法基础课笔记 第三章 C++中的循环结构 第三章 C++中的循环结构 学习编程语言语法是次要的,思维是主要的。如何把头脑中的想法变成简洁的代码,至关重要。 ——闫学灿
相关文章
- C++深入浅出(四)—— 类和对象(下)
- 【C++保姆级入门】习题掌握循环结构
- 【数据库开发】windows下使用c++调用redis
- 【C/C++】什么是线程安全
- C++内存管理4-Windows编程中的堆管理(转)
- windows下使用vscode编写运行以及调试C/C++
- Windows:C++11并发编程-条件变量(condition_variable)详解
- 《挑战30天C++入门极限》C/C++中字符指针数组及指向指针的指针的含义
- 【C/C++】一道试题,深入理解数组和指针
- Windows Vscode C++17/20 配置教程
- 【Windows 逆向】CheatEngine 工具 ( 汉化版 CE 工具推荐 | 编写简单 C++ 程序 | C++ 程序执行分析 | 使用 CE 修改上述 C++ 程序 )
- 【并发编程十四】c++原子操作(2)——实现自旋锁
- ISE(Iris Server Engine)是一个基于现代C++的跨平台(Linux和Windows)框架
- C/C++获取操作系统、CPU、内存信息(windows和linux)
- 一个Windows C++的线程类实现
- 30.C++复习篇
- 14.C++-二阶构造模式、友元(详解)
- 关于windows下c++生成的exe发布时的依赖dll问题
- C++MFC编程笔记day05 文档类-单文档和多文档应用程序
- C++windows内核编程笔记day13 进程、线程与信号量
- c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理
- C++windows内核编程笔记day06 代码创建菜单
- 如何在WINDOWS下编译BOOST C++库 .