静态链接库:lib
建立头文件testlib.h--建立源文件testlib.cpp
testlib.h
#ifndef TESTLIB_H
#define TESTLIB_H
//防止头文件重复包含
//条件编译指令
//加减乘除
int add(int a,int b);
#endif
testlib.cpp
#include "testlib.h"
//加减乘除
int add(int a,int b)
{
return a+b;
}
在VS里面点击生成-解决方案(静态库已经开发好了)
在testlib/Debug目录下,生成testlib.lib(二进制代码)
lib,库文件不能独立运行
新建一个项目,建立源文件test.cpp
#include <stdio.h>
//解决方案testlib中有两个项目,分别是test和testlib
#include "../testlib/testlib.h"//上一级目录下
//右击项目-属性-连接器-常规-附加库目录-写相对路径(包含testlib.lib)
#pragma comment(lib,"testlib.lib")
int main()
{
printf("请输入两个整数,计算当前两个整数的和\n");
int a,b;
scanf("%d%d",&a,&b);
//调用一下静态库
printf("add(a,b)=%d\n", add(a,b));
reutrn 0;
}
进行打包发布,新建文件夹,在文件夹下面新建include文件夹(包含头文件),lib文件夹(包含lib文件)
动态链接库:dll
需要工具-百度-www.dependencywalker.com-x64是64位的,x86是32位的
静态库将所有lib组合到exe中,容易造成exe过大
动态库,动态加载,利于软件升级,联网-下载-替换-重启
头文件testdll.h-源文件testdll.cpp
testdll.h
#ifndef TESTDLL_H
#define TESTDLL_H
int add(int a,int b);
#endif
testdll.cpp
#include"testdll.h"
int add(int a,int b)
{
return a+b;
}
动态库不能独立运行,可以按Ctrl+f,会显示无法运行程序,不过没有问题
或者右键项目-重新生成
在testdll/Debug目录下,testdll.dll
将testdll.dll往Dependency里面一拖
在testdll.h里面添加
testdll.h
#ifndef TESTDLL_H
#define TESTDLL_H
//条件编译指令
//右击项目-属性-配置属性-c/c++-预处理器-预处理器宏定义-加上_DLLAPI
#ifdef _DLLAPI
//同时生成了testdll.lib和testdll.exp
#define DLLAPI _declspec(dllexport)
#else
#define DLLAPI _declspec(dllimport)
#endif
//声明导出函数,使用c语言的方式来进行编译
extern "C" DLLAPI int add(int a,int b);
#endif
动态库的使用
新建一个项目,建立源文件test.cpp
#include <stdio.h>
#include "../testdll/testdll.h"
//右击项目-属性-连接器-常规-附加库目录-写相对路径(包含testdll.dll)
//导入
//#pragma comment(lib,"testdll.lib")//这个不是真正的静态库,隐式调用动态库
//显示调用静态库
#include <windows.h>
typedef int (*PADD)add(int a,int b);//函数指针
int main()
{
printf("请输入两个整数,计算当前两个整数的和\n");
int a,b;
scanf("%d%d",&a,&b);
//显示调用动态库,在需要的时候用
//加载一下dll文件
HMODULE hDLL = LoadLibrary(L"../Debug/testdll.dll");
if(hDLL==NULL)
{
printf("加载DLL文件失败。\n");
return 0;
}
//导出函数,获取函数的指针
//c语言的动态库,是原来的名称,但cpp会改变
//为了防止编译器把导出接口改名字,需要更改testdll.h文件
PADD pAdd=(PADD) GetProcAddress(hDLL,"add");
printf("add(a,b)=%d\n", add(a,b));
FreeLibrary(hDLL);
reutrn 0;
}
有模块定义文件:使用原始头文件-右键项目-重新生成
右键项目-添加-新建项-代码-def文件
LIBRARY testdll
EXPORTS
add