特别篇之动态链接库,静态链接库
来源:互联网 发布:苏联加入轴心国 知乎 编辑:程序博客网 时间:2024/04/29 07:30
dll(dynamic linking library)
msdn上说:
dll是一个包含函数和数据的模块,被其它模块调用,包括应用程序或其他dll。
在一个dll可以定义导出和内置这两种函数,导出函数可以被外部和内部调用,内置函数则在内部调用。尽管dll可以导出数据,但通常用于它的函数中。但也不阻止数据被导出(比如说资源库)。
dll提供了一种方法使应用程序模块化以便于它的功能更新和重用,dll也减少了内存开销当多个程序同时使用同一功能时,因为每个程序使用的是同一dll的副本,共享同一段dll代码.
顾名思义dll是动态链接时需要的库函数。那么什么是动态链接呢?
动态链接就是把调用的函数所在文件模块(DLL)的信息和调用函数在DLL中的位置等信息(.lib)在链接时链接到.exe文件中,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。 lib,dll是已经编译好的二进制代码.
什么时候使用动态链接库呢,程序中又怎么调用呢?
一般来说,只有用于大型程序中才最有意义,封装公用代码和资源,一来缩小体积,二来灵活高效。而在小程序中直接静态链接进去反而效率更高,同时也便于传播。
隐式调用:
1) 在主程序包含DLL中导出的头文件。
2) 采用#pragma comment(lib,"..//debug//libTest.lib")导入动态库生成的*.lib头文件。或在projectàsettingsàLinkeràInput的Additional Dependencies中加入lib文件。
3) 将动态库生成的*.dll文件放到EXE或DLL的同一目录下。
显式调用:
// A simple program that uses LoadLibrary and // GetProcAddress to access myPuts from Myputs.dll. #include <windows.h> #include <stdio.h> typedef int (__cdecl *MYPROC)(LPWSTR); int main( void ) { HINSTANCE hinstLib; MYPROC ProcAdd; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; // Get a handle to the DLL module. hinstLib = LoadLibrary(TEXT("MyPuts.dll")); // If the handle is valid, try to get the function address. if (hinstLib != NULL) { ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); // If the function address is valid, call the function. if (NULL != ProcAdd) { fRunTimeLinkSuccess = TRUE; (ProcAdd) (L"Message sent to the DLL function\n"); } // Free the DLL module. fFreeResult = FreeLibrary(hinstLib); } // If unable to call the DLL function, use an alternative. if (! fRunTimeLinkSuccess) printf("Message printed from executable\n"); return 0;}
静态链接(static linking)
一般是在程序开发过程中发生的,用于把一些文件链接在一起创建一个windows可执行文件。这些文件包括各种各样的对象模块(.obj),运行时库文件(.lib),通常还有已编译的资源文件(.res)。
这里所指的对象模块(.obj)是指已编译后的源程序,运行时库文件(lib)是指一些静态链接库。已编译的资源文件(.res)是指编译成二进制码的资源文件,也有些资源是不用编译。静态链接库包含声明与实现,在程序链接的时候嵌入到宿主程序中包含在最终形成exe文件里。
使用方法:
//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数
#endif
//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}
#include <stdio.h>
#include "../lib.h"//不可丢失
#pragma comment( lib, "..//debug//libTest.lib" ) //指定与静态库一起连接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}
请注意静态链接并非链接该类库中的所有内容,从生成的exe文件大小和程序分析可知,链接器只从静态类库中提取与宿主程序调用相关的代码,重复调用时也会重复生成。
区别于动态链接,如果在当前工程中有多处对dll文件中同一个函数的调用,那么执行时,这个函数只会留下一份拷贝。这样才达到了节省空间的目的。同时,如果更新的话,要是仅仅是函数内容变化的话,也只有重新编译dll,而不是整个工程
- 特别篇之动态链接库,静态链接库
- 动态链接库之静态链接和动态链接
- 动态链接库、静态链接库;动态链接、静态链接
- 动态链接,静态链接,动态链接库,静态链接库
- 静态动态链接库
- 动态+静态链接库
- 动态静态链接库
- 静态库链接、动态库静态链接和动态链接
- C++基础之静态链接库and动态链接库
- linux编程之静态链接库和动态链接库
- Linux 静态链接库与动态链接库之二:动态链接库生成及使用
- Linux 静态链接库与动态链接库之二:动态链接库生成
- Linux 静态链接库与动态链接库之二:动态链接库生成
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- 静态链接库与动态链接库
- 动态链接库与静态链接库
- 动态链接库与静态链接库
- 【复习总结】一些简单的排序算法
- LeetCode Valid Anagram
- 运行eclipse 64位出错;Failed to load the JNI shared library
- LeetCode202——Happy Number快乐数
- 南邮 OJ 1022 哈夫曼编码与译码
- 特别篇之动态链接库,静态链接库
- 如何把报表放到网页中显示(Web页面与报表简单集成例子)
- HDU 1114 Piggy-Bank(完全背包)
- MinHook - 最小化的 x86/x64 API 钩子库
- web批量打印分享,注意也许不成熟,待大批量测试(不使用插件,纯jq,css)
- TeXstudio中如何编译eps格式的图片
- dom4j通过xpath查询xml (转)
- oracle: linux服务器本机不能登陆的解决
- volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?