静态链接库和动态链接库的区别

静态链接库

  • 在编译时将库的代码(.lib文件)和应用程序的代码合并在一起,生成一个单独的可执行文件。
  • 发布时非常方便,直接一个.exe文件即可

动态链接库(共享库)

  • 库的代码在编译时和链接时与应用程序分开。应用程序包含对库的引用(.lib文件,在这里被称为导入库),但不包含库的实际代码。
  • 运行时,操作系统加载共享库(dll),并将其与应用程序连接。

在对你的项目进行依赖设置时就会发现,链接静态库和动态库的步骤是基本一致的,比如用Premake工具维护的项目中,在premake.lua文件中,通过links{myStaticLibrary, mySharedLibrary }来链接库;比如Cmake维护的项目中,通过target_link_libraries(MyProject PRIVATE LibraryName)来链接库,并没有区分是静态还是动态,编译器一般会自己判断。额外的,如果是动态库,还需要把.dll文件放在可执行文件的目录下。

链接一个共享库和静态库都是link一个.lib文件,区别是,链接共享库时这个.lib是作为一个导入库来使用,这个 .lib 文件包含了链接器在编译时所需的符号信息(类似于头文件的概念,只包含声明,但没有实现),这使得编译器能够在编译阶段正确引用 dll 中的函数和数据(dll存放的才是真正的可执行代码)。

总结一下,一个动态库的链接:

  • 编译时链接(Compile-Time Linking): 通过 .lib 文件,在编译阶段将项目与 DLL 相关联,以获取符号信息。
  • 运行时加载(Run-Time Loading): 在程序运行时动态加载 DLL 文件,获取其中的实际代码和数据。

选择静态链接还是动态链接取决于应用程序的需求和设计考虑。静态链接适用于独立分发,而动态链接则有助于节省系统资源和更新库代码。

大多数游戏引擎通常会使用动态链接库(DLL)的方式进行链接。有几个优点:

  1. 节省内存空间: 游戏引擎通常具有大量共享的功能和资源,如图形渲染、物理模拟、声音处理等。通过动态链接,多个游戏实例可以共享相同的引擎部分,减少内存占用。

  2. 灵活更新: 如果游戏引擎的某个模块需要更新,你只需要替换相应的动态链接库文件,而不必重新构建整个游戏。这有助于减少发布更新所需的时间。

  3. 插件支持: 动态链接库的模块化特性使得游戏引擎可以更容易地支持插件。新的功能可以通过添加新的动态链接库来扩展游戏引擎,而无需修改已有的代码。

  4. 维护性: 游戏引擎的不同部分可以独立开发和维护,因为它们都可以作为独立的动态链接库。这有助于团队合作和代码维护。、


库存在的最大的意义就是为了将一组相关的代码(比如多个cpp文件,定义了非常多的函数、类等等)打包成一个单一的单元,以便在其他项目或者同一项目的不同部分中共享和重用

比如你是想编译100个cpp ,还是直接链接一个.lib 或 .dll 明显后者方便

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗浩多捞

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值