windows使用静态库和动态库

1. 使用静态库

mylib.h中声明2个函数

#pragma once

int add(int a, int b);

int sub(int a, int b);

mylib.c函数实现

#include "mylib.h"

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

int sub(int a, int b)
{
	return a - b;
}

方式一,添加依赖项

链接器输入添加静态库

引用静态库

#include <stdio.h>
#include <stdlib.h>

//静态库的头文件直接放入项目的根目录
#include "mylib.h"

//将mylib.lib文件放入项目的根目录下
//方式1. 链接器 输入 附加依赖项 添加 mylib.lib 

//方式2. 指定引用静态库mylib, 
//#pragma comment(lib,"mylib.lib")

int main(int argc, char *argv[])
{
	int a = 10;
	int b = 20;
	int sum = add(a, b);
	printf("sum=%d\n", sum);

	sum = sub(20, 10);
	printf("sum=%d\n", sum);
	system("pause");
	return 0;
}

2. 使用动态库

先简单学习函数指针

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

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

int main(int argc, char *argv[])
{
	typedef int func(int, int); //定义一个函数类型
	func *pfunc;                //定义一个函数类型的指针(函数指针)
	pfunc = add;
	int sum = pfunc(10, 20);
	printf("%d\n", sum);
	system("pause");
	return 0;
}

动态库 代码

//_declspec (dllexport) 将函数进行导出
_declspec (dllexport) int add(int a, int b)
{
	return a + b;
}

_declspec (dllexport) int sub(int a, int b)
{
	return a - b;
}


设置为动态库dll

调用动态库代码

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main(int argc, char *argv[])
{
	int a = 20;
	int b = 10;

	//定义函数指针
	typedef int(*Add)(int a, int b);
	typedef int(*Sub)(int a, int b);

	//通过LoadLibraryEx,动态加载dll文件
	HMODULE hmodule = LoadLibraryEx("mydll.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);

	//获取add函数地址,用我们定义的函数指针接收add函数地址
	Add add = (Add)GetProcAddress(hmodule, "add");
	int sum = add(a, b);
	printf("sum=%d\n", sum);

	//获取sub函数地址, 用我们定义的函数指针接收sub函数地址
	Sub sub = (Sub)GetProcAddress(hmodule, "sub");
	int result = sub(a, b);
	printf("result=%d\n", result);

	//使用完之后,要进行释放
	FreeLibrary(hmodule); 
	system("pause");
	return 0;
}

生成之前,指定应用动态库的所在目录

设置动态库引用的目录
秋风 2017-03-20