静态链接库(需要给用户两个文件lib.h和staticLib.lib)
- 创建一个静态链接库staticLib,包含一个.h文件和一个.cpp文件
//lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);
#endif
//lib.cpp
#include "lib.h"
int add(int x,int y){
return x+y;
}
- 创建一个测试项目libTest
#include "stdio.h"
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\staticLib.lib") //指定与静态库一起连接
int main(){
printf("2+3=%d \n",add(2,3));
return 0;
}
动态链接库
导出函数
- DLL内的函数分为两种
- DLL导出函数:可供应用程序调用
- DLL内部函数:只能在DLL程序使用,应用程序无法调用他们
DLL中声明导出函数有两种方式
- 在函数声明中加上__declspec(dllexport)
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x,int y);
#endif
- 采用模块定义(.def).在dllLib中添加lib.def文件
;.def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能 与语句共享一行。
;lib.def:导出DLL程序
;LIBRARY语句说明.def文件相应的DLL
LIBRARY dll
;EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数 名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥 其作用);
EXPORTS
add @ 1
- DLL调用方式
- 静态调用
#include "stdio.h"
//将编译 dll工程所生成的.lib和.dll文件拷入dllTest工程所在的路径,dllTest 执行下列代码:
#pragma comment(lib,"dll.lib")
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
int result = add(2,3);
printf("%d\n",result);
return 0;
}
- 动态调用
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); //定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("..\\Debug\\dll.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(1, 3);
printf("%d\n", result);
}
FreeLibrary(hDll);
}
return 0;
}