程序运行的四个阶段:预处理,编译,汇编,链接
静态库(lib):在链接阶段,将代码完整的拷贝到可执行程序
动态库(dll):在链接阶段,将引入库(.lib,存储的为函数名和位置)拷贝到可执行程序
一 . 静态库:
以C语言的形式生成库
.h中
extern "C" int add(int ,int); extern "C" int sub(int ,int);
二. 测试静态库:(将.h和.lib放入)
.h
#ifdef __cplusplus//c++程序员用c的方式打开 extern "C" int add(int ,int); extern "C" int sub(int ,int); #else //c的程序员直接打开 int add(int ,int); int sub(int ,int); #endif
源.cpp
#include <iostream> #include "stdafx.h"//声明 using namespace std; #pragma comment(lib,"静态库.lib")//在链接阶段,导入静态库(方法一) int main() { cout<<add(3,4)<<endl; system("pause"); return 0; }
导入静态库(方法二):右键->属性->链接器->输入->静态库.lib
三. 动态库:
两种导出方式:
1. 源文件右键添加新建项 代码 模块定义文件
LIBRARY "动态库.dll"
EXPORTS
add @1
sub @2
2. 在要导出的函数位置前加_declspec(dllexport)
四 . 测试动态库(导入.lib和.dll(.dll要与.exe在同一目录文件下))
两种加载方式:
1.隐式加载:#pragma comment(lib,"0305动态库.lib")
#include <iostream> #include "mydll.h" using namespace std; //引入库 --隐式加载 #pragma comment(lib,"0305动态库.lib") int main() { cout<<add(4,6)<<endl; system("pause"); return 0; }
2.显示加载
#include <iostream> #include <Windows.h> using namespace std; typedef int (*PFUN)(int,int); int main() { //显示运行时加载 //1.加载库 HMODULE hmodule = LoadLibrary(L"../debug/0305动态库.dll"); //2.获得库函数的地址 if(hmodule) { PFUN pfun = (PFUN)GetProcAddress(hmodule,"add"); cout<<(*pfun)(2,3)<<endl; //3.卸载库 FreeLibrary(hmodule); } system("pause"); return 0; }
更新:
只更新函数实现时,只需将.dll重新复制
更改函数名和导出方式时,需要将.dll和.lib重新复制