一. 静态库和动态库的创建
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