【问题标题】:Creating static libraries and static linking with MSVC Build Tools on Windows在 Windows 上使用 MSVC 构建工具创建静态库和静态链接
【发布时间】:2022-01-19 05:52:39
【问题描述】:

我目前的目标是编译 SQLite 库(C 语言),它使用 MSVC 构建工具与 Windows 上的依赖项静态链接。我想获得一个 DLL 文件,它可能只依赖于核心 Windows/VC 组件,例如 kernel32 或 VC 运行时。 SQLite 库有几个具有外部依赖关系的扩展,例如 Zipfile/zlib 或 ICU/ICU。我想使用 sqlite3.dll 文件中静态链接的所有必要代码启用这些扩展。我可以用动态链接编译它就好了,但它需要单独的 dll 依赖文件,这是我想要避免的。

Micorosoft 有一个基本教程Walkthrough: Create and use a static library,但我没有看到有关如何从 MSVC 构建工具命令行执行此操作的明确说明。我的理解是,要静态链接依赖项,需要一个静态库文件 .lib 。同时,导入库也有 .lib 扩展名。

我有几个问题:

  • 如何判断给定的 .lib 文件是导入库还是静态库? (我对具体说明感兴趣,可能涉及一些命令行 MS Build 或 Windows Resource Kit 工具。)
  • 在给定单个源文件(例如 SQLite3.c 没有外部依赖项)的情况下,如何从命令行创建静态库与导入库?
  • 如果所有依赖项都作为静态库提供,MS 链接器将自动创建静态链接的 dll,这是否正确? (比如说,我在 SQLite 中启用了 Zipfile 扩展,根据上一个问题的说明构建了一个静态 zlib 库,并将其作为 MS Build Tools 链接器的依赖项提供。)或者是否有特殊标志来请求静态链接?

【问题讨论】:

    标签: c windows msbuild static-libraries static-linking


    【解决方案1】:

    好的,经过进一步探索,我似乎有了答案。

    第一个问题在here 之前被问到这里,并且有一个有趣的评论与使用MinGW 创建的libraries 相关(one 更相关的MinGW 相关问题)。有几个选项,最简单的似乎是lib /list sqlite3.lib,它应该列出静态库的对象并且不为导入库生成输出。

    Misrosoft 给出了第二个问题的答案,指出
    LIB 的默认模式是构建或修改 COFF 对象库。当您不指定 /EXTRACT(将对象复制到文件)或 /DEF(构建导入库)时,LIB 会在此模式下运行。

    第三个问题在here 之前讨论过,看来答案是“是”。想一想,静态库应该包含实际的对象,并且不包含有关 DLL 的信息(可以独立创建)。无论哪种方式,lib 文件都不适合在运行时使用,因此成功链接静态库的唯一可能性应该是静态模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多