一. 静态库和动态库的创建

1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入staticlib。点击确定。

 

2.在解决方案资源管理器的头文件中添加,mylib.h文件,在源文件添加mylib.c文件(即实现文件)。

 

3.在mylib.h文件中添加如下代码:

#ifndef TEST_H
#define TEST_H

int myadd(int a,int b);

#endif

    在mylib.c文件中添加如下代码:

#include"test.h"

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

 

如果是动态库的话需要使用__declspec(dllexport)为导出函数:

#ifndef TEST_H
#define TEST_H

__declspec(dllexport) int myminus(int a, int b);

#endif

    在test.c文件中添加如下代码:

#include"test.h"

__declspec(dllexport) int myminus(int a, int b){
return a - b;
}

 

5. 配置项目属性。因为这是一个静态链接库,所以应在项目属性的“配置属性”下选择“常规”,在其下的配置类型中选择“静态库(.lib)。

 

6.编译生成新的解决方案,在Debug文件夹下会得到mylib.lib (对象文件库),将该.lib文件和相应头文件给用户,用户就可以使用该库里的函数了。
 

 

 

二. C语言中调用动态库函数的两种方式

方式一.隐式调用(链接)

将动态库的相关文件拷贝到当前目录下(lib、dll),然后添加以下代码,在程序中指定连接库函数。

注意:第二个参数给出的是引入库文件(或称“导出库文件”),而不是dll。在程序运行过程中,lib将dll中需要用到的函数映射到对应的内存空间。

#pragma comment(lib, "./mydll.lib")

方式二.显示调用(链接)

需要包含Windows.h的头文件,具体代码如下:

需要设置一个句柄(此处为void *):在程序设计中,句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"fun.h"
#include<Windows.h>
typedef int(*MYFUNC)(int, int);
#pragma comment(lib, "./mydll.dll")
int main(int argc, char *argv[])
{
	HANDLE hDll; //void *
	hDll = LoadLibrary("mydll.dll"); //导入动态链接库
	MYFUNC my_add = (MYFUNC)GetProcAddress(hDll, "my_add");//proc程序

	int a = my_add(1, 2);
	printf("%d\n", a);

	system("pause");
	return 0;
}

三. 调用静态库函数

只要在第二个参数位置指定目录即可。

#pragma comment(lib, "./mydll.lib")

 

四. 不以名字导出函数——序号导出

名字是一段程序最精华的注释,通过名字可以直接猜测到函数的功能,通过使用序号,可以达到隐藏的目的。

添加.def文件

EXPORTS	
	
Plus   	@12
Sub	@15 NONAME
Mul    	@13
Div    	@16