19 动态库和静态库

文章目录

  • 静态库
  • 动态库
    • dll模块入口函数

静态库

选择桌面向导里面的静态库
19 动态库和静态库_第1张图片19 动态库和静态库_第2张图片19 动态库和静态库_第3张图片
设置为发布版,设置重新生成19 动态库和静态库_第4张图片
19 动态库和静态库_第5张图片创建文件夹放入库和头文件
19 动态库和静态库_第6张图片
将库放入工程目录下面
19 动态库和静态库_第7张图片在属性中选择C/C++附加包含目录,选择include
19 动态库和静态库_第8张图片属性中链接器选择附加目录将lib选中
19 动态库和静态库_第9张图片

#include 
#include 

#pragma comment(lib,"Testlib.lib")//obj,lib 组合打包形成exe
int main()
{
	int a = 10, b = 99;
	printf("a+b=%d", add(a, b));

	return 0;
}

不写#pragma comment(lib,“Testlib.lib”)可在属性链接器输入中的附加依赖项写入
19 动态库和静态库_第10张图片

改写为相对路径19 动态库和静态库_第11张图片19 动态库和静态库_第12张图片

动态库

19 动态库和静态库_第13张图片
19 动态库和静态库_第14张图片
19 动态库和静态库_第15张图片
放入到文件夹中
19 动态库和静态库_第16张图片19 动态库和静态库_第17张图片19 动态库和静态库_第18张图片

#include 
#include 
#pragma comment(lib,"Testdll.lib") //隐式调用
int main()
{
	int a = 10, b = 10;
	printf("a+b=%d\n", add(a , b));

	return 0;
}

19 动态库和静态库_第19张图片
19 动态库和静态库_第20张图片

显示调用

extern "C" __declspec(dllexport) int add(int a, int b);
#include 
#include 
#include 
//#pragma comment(lib,"Testdll.lib") //隐式调用

//定义一个函数指针类型
typedef int(*PADD)(int, int);

int main()
{
	//显示调用
	HMODULE  hTestdll=LoadLibrary(L"Testdll.dll");//当前exe文件下>面
	if (hTestdll == NULL)
	{
		printf("加载失败");
		return 0;
    }
	PADD add=(PADD)GetProcAddress(hTestdll, "add");
	int a = 10, b = 10;
	printf("a+b=%d\n", add(a , b));
	//卸载模块
	FreeLibrary(hTestdll);
	return 0;
}

或者添加模块定义文件可以去掉extern “C”
19 动态库和静态库_第21张图片19 动态库和静态库_第22张图片

dll模块入口函数

#include "Testdll.h"
#include 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	switch (fdwReason)
	{
	case DLL_PROCESS_ATTACH:
		MessageBox(NULL, L"进程加载", L"提示", MB_OK);
		break;
	case DLL_THREAD_ATTACH:
		MessageBox(NULL, L"线程加载", L"提示", MB_OK);
		break;
	case DLL_PROCESS_DETACH:
		MessageBox(NULL, L"进程卸载", L"提示", MB_OK);
		break;
	case DLL_THREAD_DETACH:
		MessageBox(NULL, L"线程卸载", L"提示", MB_OK);
		break;
	}
}


int add(int a, int b)
{
	return a+b;
}

你可能感兴趣的:(数据库,服务器,运维)