动态库和静态库的理解
2018-06-17 22:18:58来源:未知 阅读 ()
1.1 库的概念
在我看来,库是已经写好的、成熟的、可复用的代码。每个程序都需要依赖很多底层库,不可能每个人的代码从零开始编写代码,因此库的存在具有非常重要的意义。
在我们的开发的应用中经常有一些公共代码是需要反复使用的,就把这些代码编译为库文件。
库可以简单看成一组目标文件的集合,将这些目标文件经过压缩打包之后形成的一个文件。像在Windows这样的平台上,最常用的c语言库是由集成按开发环境所附带的运行库,这些库一般由编译厂商提供。
1.2 vs下静态库创建和使用
1.2.1 静态库的创建
#ifndef TEST_H
#define TEST_H
int myadd(int a,int b);
#endif
|
#include"test.h"
int myadd(int a, int b){
return a + b;
}
|
1.2.2 静态库的使用
A、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。
B、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。
C 然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。
|
#pragma comment(lib,"./mylib.lib")
|
就像你添加.h和.cpp文件一样,把lib文件添加到工程文件列表中去.
切换到"解决方案视图",--->选中要添加lib的工程-->点击右键-->"添加"-->"现有项"-->选择lib文件-->确定.
|
1.2.3 静态库优缺点
n 静态库对函数库的链接是放在编译时期完成的,静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;
n 程序在运行时与函数库再无瓜葛,移植方便。
n 浪费空间和资源,所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
|
1.3 vs下动态库创建和使用
1.3.1 动态库的创建
#ifndef TEST_H
#define TEST_H
__declspec(dllexport) int myminus(int a, int b);
#endif
|
#include"test.h"
__declspec(dllexport) int myminus(int a, int b){
return a - b;
}
|
疑问一:__declspec(dllexport)是什么意思?
动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。 导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。
疑问二:动态库的lib文件和静态库的lib文件的区别?
在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。
|
1.3.2 动态库的使用
创建主程序TestDll,将mydll.h、mydll.dll和mydll.lib复制到源代码目录下。
(P.S:头文件Func.h并不是必需的,只是C++中使用外部函数时,需要先进行声明)
在程序中指定链接引用链接库 : #pragma comment(lib,"./mydll.lib")
|
HANDLE hDll; //声明一个dll实例文件句柄
hDll = LoadLibrary("mydll.dll"); //导入动态链接库
MYFUNC minus_test; //创建函数指针
//获取导入函数的函数指针
minus_test = (MYFUNC)GetProcAddress(hDll, "myminus");
|
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 静态持续变量 2020-05-10
- 透彻理解C++11新特性:右值引用、std::move、std::forward 2020-04-30
- [题记-动态规划] 编辑距离 - leetcode 2020-04-06
- STL之vector 2020-04-06
- C语言数组指针的理解方式 2020-03-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash