共同点:
1.都是用.cpp文件写的
2.内容无非是变量或者函数
3.是特殊的.obj文件,生成的都是二进制代码
不同点(占用内存上,参与程序运行时间段,调用方式,报错):
1.静态库文件后缀.lib,动态库文件后缀.dll
2.看看占用内存上的对比,前提:静态库A和动态库B里有相同变量c和相同函数d
有一个程序需要用库里的函数,加载的是静态库,那函数所占内存会计算到这个程序上(需要什么内存会多什么)
同样这个程序要用到库里的函数,加载的是动态库,那函数和变量的内存会计算到这个程序上
这样来说:用静态库要省内存
有三个程序要用到库里的函数,加载的是静态库,那函数所占内存x3
有三个程序要用到库里的函数,加载的是动态库,那函数所占内存x1和变量所占内存x1
这样来说:用动态库要省内存
原理:静态库是在用的时候,用到什么,将什么加载在exe中,生成一遍后,lib可以删除了,库中用的内容已经保存在程序里了
动态库是用的时候,执行跳进动态库,运行过后在跳出去,下一个程序也同样,这样感觉动态库放在了三八线中间,谁都可以用,用完了在放回去,因为它一直存在于三八线那里,所以动态库需要占用的内存是一份,且大小是库里所有内容所占内存大小,程序运行一遍后可不能删除dll
3.静态库在程序编译的时候参与
动态库在程序运行的时候参与
4.报错
静态库用到缺失报错:Link
动态库用到缺失报错:程序启动失败
5.调用方式上不同(下面说的就是你怎么创建个库,怎么用)
我用的是VS2010,静态库的使用:
<1.创建win32项目,下一步选择静态库
<2.新建.h和.cpp(把创建里面的东西都删掉,白白的,不过可以留下条件编译,然后写库里的内容,写的函数或者变量前加个 extern “C”(告诉编译器不要改名字),原因是C不支持多态,不加也可以生成使用)
<3.内容写完后运行生成,找到.cpp所在文件夹,上一层目录中的debug中有了lib文件
<4.将.h和.lib拷到所用项目的目录下
<5.main里加载头文件和加载静态库,使用的时候直接使用
加载静态库#pragma comment(lib,"库名.lib")
动态库的使用(有两种调用,静态调用和动态调用,静态调用有缺陷,这里说的是动态调用,用的句柄)
<1.创建win32项目,下一步DLL
<2.同静态库,在extern "C"后面加__decllspec(dllexport)(定义显示动态接口)
<3.内容写完后运行生成,找到.cpp所在文件夹,上一层目录中的debug中有了dll文件
<4.将.h和.dll拷到所用项目的目录下
<5.main里加载头文件和加载windows.h
HINSTANCE hDll=NULL;
typedef int(*PSUM)(int a,int b);
PSUM pSum;
hDll = LoadLibrary(L"cool2.dll"); //动态库名
pSum = (PSUM)GetProcAddress(hDll,"sum");
printf("%d\n",pSum(1,2));
system("pause");
FreeLibrary(hDll);
//这些代码的解释是创建句柄最后释放,详解可以网上搜着,我学到的理论,怎么用也是网上找到实验可行记下来
(PanPen原创 如有建议 请留言)