静态库:在编译的时候加载生成目标文件,在运行时不用加载库,在运行时对库没有依赖性。
动态库:在目标文件运行时加载,手动加载,且对库有依赖性。
两者区别:
一,静态库的使用需要:
1 包含一个对应的头文件告知编译器lib文件里面的具体内容
2 设置lib文件允许编译器去查找已经编译好的二进制代码
二,动态库的使用:
程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库
三,依赖性:
静态链接表示静态性,在编译链接之后, lib库中需要的资源已经在可执行程序中了, 也就是静态存在,没有依赖性了
动态,就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供 需要的 动态库,有依赖性, 运行时候没有找到库就不能运行了
四,区别:
简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。
做成静态库可执行文件本身比较大,但不必附带动态库
做成动态库可执行文件本身比较小,但需要附带动态库
五:
首先纠正所谓“静态连接就是把需要的库函数放进你的exe之中”的说法。在真实世界中,有三个概念:Use static libary, static linked DLL, dynamic linked DLL.
多数人混淆了static libary 和 static linked DLL的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明。
使用静态库(Use static libary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等。一般情况下,可以根本就没有“对应的”.dll 文件,如C Run Time(CRT)库。一个例子就是,写一个main(){},build出来并不是只有几个字节,当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸,build出的执行文件仍然“莫名的大”。实际上那多出来的部分就是CRT静态库。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现。
下面再谈static linked DLL 和 dynamic linked DLL又如何?
静态链接 (static linked DLL)从操作上在VC的Project|Settings...|Link (tab)|General (category)|Object/library modules 中设置和添加。比如要使用SDK中的PropertySheet() API, 就要在这里添加 comctl32.lib,然后再调用的源程序中#include <prsht.h> , 使用的地方直接调用PropertySheet()。当程序.exe启动时,系统会把对应comctl32.dll加载进来。作为DLL的静态引入库的.lib不包含函数的实现,只包含用于系统加载的信息,如对应的DLL名称,函数歧视地只在对应的DLL中的便宜等等。相比动态链接而言,静态链接是很简单的。
动态链接是使用LoadLibrary()/GetProcessAddress()和FreeLibrary(),详见下面的例子。
{
typedef BOOL (WINAPI *LPFNSHELLEXECUTEEX)(LPSHELLEXECUTEINFO);
hShell32Dll = LoadLibrary(TEXT( "SHELL32.DLL "));
if (!hShell32Dll) { goto End; }
lpfnShellExecuteEx = (LPFNSHELLEXECUTEEX)GetProcAddress(hShell32Dll,
API_NAME(ShellExecuteEx));
if (!lpfnShellExecuteEx) { goto End; }
...
fOk = (*lpfnShellExecuteEx)(pShellExecuteInfo);
...
End:
if (hShell32Dll) {
FreeLibrary(hShell32Dll);
}
lpfnShellExecuteEx = NULL;
...
}
有人会想,动态链接这样麻烦,为什么还要用呢?这里有一个技术问题,对这个问题的解决直接导致了动态加载的需求。问题是有些DLL只在某个Windows版本中存在,或某个API只在某些Windows版本中被加入指定的DLL。当你使用静态链接的.exe试图在不支持的Windows版本上运行时,系统会弹出系统对话框提示某某.dll无法加载或无法定位某某API的消息,然后就中止.exe的运行。像这样因为个别功能的实现依赖于某个DLL,当这个DLL不可用时导致整个.exe无法运行是不明智的。避免这样的结局只有用动态链接。
分享到:
相关推荐
库通常分为两大类:静态库(static libraries)和动态库(dynamic libraries)。这两种库各有其优势和适用场景,在开发过程中合理选择和使用它们对于提高程序性能和维护性至关重要。 #### 二、静态库 **静态库**主要在...
静态库和动态库的主要区别在于编译和加载方式。静态库是在编译时链接的,而动态库是在运行时加载的。静态库的优点是可以减少编译时间和空间占用,但缺点是不能在运行时加载和卸载。动态库的优点是可以在运行时加载和...
在Linux系统中,动态库(Dynamic Library)和静态库(Static Library)是程序开发中不可或缺的部分,它们提供了代码复用和模块化的功能。本篇文章将深入探讨这两种库的创建、使用以及它们之间的区别。 首先,我们来...
静态库的制作:(inc/lib/src/main.c) gcc -c src/*.c(编译src目录下的.c文件生成.o文件) ar rs libmath.a *.o(生成静态库:libmath.a(命名规则:必须以lib开头,以.a结尾,中间是库名:math)) 静态库的使用: gcc main.c -...
首先,我们要理解静态库和动态库的区别。静态库(.a 或 .lib)是在编译时将库代码直接嵌入到目标程序中,形成一个完整的可执行文件;而动态库(.so 或 .dll)则是在运行时被加载,多个程序可以共享同一份库资源,...
创建动态库的步骤与静态库类似,主要区别在于选择“动态库”模板,其他配置基本一致。生成的将是.dll文件和对应的.lib导入库文件。 使用这些库时,你需要将库文件(.lib或.dll)和对应的头文件包含到你的项目中: ...
使用简单的程序展示了C++调用动态库和静态库的方法。 文件结构: exe:笔者部署可运行文件,因开发环境版本不同,可能存在无法直接使用的情况,两个部署文件(copy_ldd.sh及useLib1.sh)可以结合文章分享的(ubuntu下...
在IT领域,尤其是在嵌入式系统开发中,静态库和动态库是构建应用程序的重要组成部分。它们都是由源代码编译生成的对象文件集合,但处理方式和使用方式有所不同。 首先,让我们详细了解一下静态库和动态库的生成过程...
首先,我们需要了解静态库和动态库的区别。静态库是直接链接到目标程序中的,形成一个完整的可执行文件,而动态库则是在程序运行时动态加载,可以节省内存空间但增加了运行时依赖性。 1. 引用静态库(.a文件) 在...
压缩包内包含两个文件夹curl_静态库和curl_动态库,内容说明如下: curl_静态库下面: bin子目录包含curl.exe及动态库libcurl.dll include子目录包含头文件 lib子目录包含动态库的导入库文件libcurl.lib curl_...
3. **静态库与动态库的区别** - 静态库:将库代码合并到可执行文件中,体积较大,但避免了运行时找不到库的问题。 - 动态库:在运行时从系统路径或应用资源中加载,减少了应用体积,但需要确保系统环境或应用中...
Linux 下 g++ 编译与使用静态库和动态库 Linux 下 g++ 编译与使用静态库和动态库是 Linux 开发...静态库和动态库都是 Linux 下常用的库文件类型,它们的生成和使用方法有所不同,了解它们的区别和使用方法非常重要。
库通常分为两种主要类型:静态库和动态库(共享库)。这两种库各有优缺点,适用于不同的场景。 静态库,通常以.lib文件格式存在,其特点是将库中的函数和数据直接嵌入到最终的可执行文件中。这意味着当编译程序时,...
**Linux库的分类**:Linux下的库主要分为两大类——静态库与动态库,它们的核心区别在于代码的加载时机。静态库在编译阶段即与目标程序结合,而动态库则是在程序运行时动态加载。 #### 静态库与动态库的生成与使用 ...
为了编写、测试和优化C++代码,我们需要掌握如何使用编译器和调试器,以及理解静态库和动态库的概念及用法。下面我们将详细探讨这些主题。 1. **C++编译器** C++编译器是将源代码(.cpp文件)转换为可执行文件的...
1、二者均需要由.o文件生成,二者前缀均为lib,静态库后缀以 .a,动态库的后缀以.so 2、生成目标可执行文件后,静态库可以直接删除,因为静态库已经被加载到可...3、当静态库和动态库同名时, gcc命令将优先使用动态库
### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...