ITKeyword,专注技术干货聚合推荐

注册 | 登录

静态链接库(Lib)与动态链接库(DLL)的区别

njuitjf 分享于 2010-05-13

推荐:静态链接库lib, 动态链接库dll,导入库lib的区别

动态链接库有两种两用方式,分别是动态调用.dll和静态调用导入库.lib,那么动态链接库的静态调用方式与静态链接库调用有什么区别带着这个问题,查找到以下资料

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1053

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

“每一个lib文件就是若干函数(假设只有函数)的定义”

lib库有两种,一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库;一种是包含函数代码本身,一般现有的DLL,用的是前一种库;以前在DOS下的TC/BC等,是后一种库。包含函数原型声明的,是头文件(.h)。

“通过#include包含这些函数声明的头文件后,我们的应用程序就可以使用lib文件中的函数”

还要指定编译器链接相应的库文件。在IDE环境下,一般是一次指定所有用到的库文件,编译器自己寻找每个模块需要的库;在命令行编译环境下,需要指定每个模块调用的库。

“那他和直接给出那个函数定义的文件,比如.cpp文件,和头文件有什么区别,静态链接库有什么用”

cpp文件是源代码,库文件是编译后的二进制代码,比如你可以调用Windows的API,但是不能看到其源代码一样。

“还有不明白的是,静态链接库中的lib文件只要用到,则整个lib文件的内容都放进了exe文件中,那它是被编译进去还是链接的时候连接进去的呢?”

是在链接的时候将lib链接到目标代码中。

静态链

推荐:VC.Net中创建与使用静态链接库(lib)和动态链接库(dll),以及它们的区别

VC.Net中创建与使用静态链接库(lib)和动态链接库(dll),以及它们的区别. 使用静态库需要h文件和.lib,在项目中使用静态库需要以下步骤: 1.在项目中包含相应的静

接库(Lib) 在VC++6.0中new一个名称为libTest的static library工程, 并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下: //文件: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; }

编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。

标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:

#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 ) ); }

静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "..//debug//libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。

推荐:【C++ Primer】静态链接库(lib)和动态链接库(dll)的区别和使用

摘自:http://blog.csdn.net/tianshuai11/article/details/7732717 如果对Linux下静态链接库和动态链接库感兴趣,请狂点击 -->你懂的 一,概念         1)静态

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。