windows 动态库和静态库 介绍

在Windows平台上,动态库和静态库都是用于组织和共享代码的方式。这些库文件的扩展名和用途有一些区别。

1. 静态库和动态库

  • 静态库(Static Library):

    • 文件扩展名:.lib
    • 在编译链接时,静态库的代码被直接嵌入到可执行文件中。
    • 优点:编译后的可执行文件独立,不依赖外部库文件。
    • 缺点:如果多个程序使用同一个静态库,会导致代码冗余。
  • 动态库(Dynamic Link Library):

    • 文件扩展名:.dll
    • 在编译链接时,程序只包含对动态库的引用,实际的代码在运行时才会加载。
    • 优点:节省内存,多个程序可以共享同一个动态库。
    • 缺点:程序运行时需要确保能找到对应版本的动态库。

2. Windows下的库文件

  • 静态库:

    • 静态库在Windows上通常使用 .lib 扩展名。例如:mylib.lib
    • 在使用静态库的项目中,需要在项目属性的链接器设置中添加 .lib 文件。
  • 动态库:

    • 动态库在Windows上通常使用 .dll 扩展名。例如:mylib.dll
    • 在使用动态库的项目中,需要在项目属性的链接器设置中添加 .lib 文件(这是用于链接动态库的导入库)。
    • 动态库还需要在运行时找到,可以将 .dll 文件放在程序可执行文件所在的目录,或者添加到系统路径中。

3. 导入库(Import Library)

  • 导入库是什么:

    • 在Windows上,用于链接动态库的 .lib 文件通常被称为导入库。导入库实际上是一种特殊的静态库,包含了调用动态库函数的信息。
  • 导入库的生成:

    • Visual Studio 编译动态库时,会自动生成一个与动态库同名但扩展名为 .lib 的导入库。
    • 这个导入库包含了动态库的函数信息,用于在链接时告诉编译器如何调用动态库中的函数。

4. 使用静态库的步骤

  1. 编写代码并编译成目标文件(.obj):

    cl /c mylib.cpp
    
  2. 将目标文件打包成静态库:

    lib /OUT:mylib.lib mylib.obj
    
  3. 在项目中链接静态库:

    • 在 Visual Studio 中,将 mylib.lib 添加到项目属性的链接器设置中。

5. 使用动态库的步骤

  1. 编写代码并编译成目标文件(.obj):

    cl /c mylib.cpp
    
  2. 编写代码并编译成动态库(.dll):

    cl /LD mylib.obj
    
  3. 在项目中链接动态库:

    • 在 Visual Studio 中,将 mylib.lib(导入库)添加到项目属性的链接器设置中。
    • mylib.dll 放置在可执行文件所在目录或者添加到系统路径中。

总结

  • 静态库和动态库都是在组织和共享代码方面的重要概念。
  • 静态库在链接时直接嵌入到可执行文件中,而动态库在运行时加载。
  • 在Windows上,静态库使用 .lib 扩展名,动态库使用 .dll 扩展名。
  • 链接动态库时需要使用导入库(.lib 文件)提供函数信息。

上文是简单的介绍,实际使用过程中可能还涉及到一些特殊情况和编译器/工具的不同行为。

相关推荐

  1. windows 动态静态 介绍

    2023-12-22 17:52:02       40 阅读
  2. 静态动态

    2023-12-22 17:52:02       21 阅读
  3. 静态动态

    2023-12-22 17:52:02       9 阅读
  4. 静态动态的了解

    2023-12-22 17:52:02       10 阅读
  5. [xmake]构建静态动态

    2023-12-22 17:52:02       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 17:52:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 17:52:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 17:52:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 17:52:02       18 阅读

热门阅读

  1. [node] Node.js的内置模块

    2023-12-22 17:52:02       31 阅读
  2. 如何在Go中发起HTTP请求

    2023-12-22 17:52:02       51 阅读
  3. Ubuntu2204安装小熊猫C++/DevCpp

    2023-12-22 17:52:02       52 阅读
  4. MySQL数据备份

    2023-12-22 17:52:02       41 阅读
  5. mysql 表锁 行锁

    2023-12-22 17:52:02       36 阅读
  6. openstack-keystone服务

    2023-12-22 17:52:02       36 阅读
  7. SQL server 数据库 SQL语句高级用法

    2023-12-22 17:52:02       29 阅读
  8. GO设计模式——25、模板模式(行为型)

    2023-12-22 17:52:02       36 阅读
  9. ThreadLocal和Synchronized的用法和区别

    2023-12-22 17:52:02       45 阅读