在 Windows 上使用 MSVC 构建工具创建静态库和静态链接
Creating static libraries and static linking with MSVC Build Tools on Windows
我目前的目标是编译 SQLite 库(C 语言),静态 linked 依赖于 Windows 和 MSVC 构建工具。我想获得一个 DLL 文件,它可能只依赖于核心 Windows/VC 组件,例如 kernel32 或 VC 运行时。 SQLite 库有几个具有外部依赖性的扩展,例如 Zipfile/zlib 或 ICU/ICU。我想在 sqlite3.dll 文件中静态 linked 启用所有必要代码的这些扩展。我可以用动态 linking 编译它就好了,但它需要单独的 dll 依赖文件,这是我想避免的。
Microsoft 有基本教程 Walkthrough: Create and use a static library,但我没有从 MSVC Build Tools 命令行中看到关于如何操作的明确说明。我的理解是,对于 link 静态依赖,静态库文件 .lib 是必需的。同时导入库也有.lib扩展名。
我有几个问题:
- 如何判断给定的 .lib 文件是导入库还是静态库? (我对具体说明感兴趣,可能涉及一些命令行 MS Build 或 Windows Resource Kit 工具。)
- 如何在给定单个源文件的情况下从命令行创建静态库与导入库,例如,SQLite3.c 没有外部依赖项?
- 如果所有依赖项都作为静态库提供,MS linker 将自动创建静态 linked dll,这是否正确? (比如,我在 SQLite 中启用 Zipfile 扩展,根据上一个问题的说明构建静态 zlib 库,并将其作为 MS Build Tools linker 的依赖项提供。)或者是否有特殊标志来请求静态link正在?
好的,经过进一步探索,我似乎找到了答案。
第一个问题是在 here, and there is an interesting comment related to libraries created with MinGW ( 更相关的 MinGW 相关问题之前在这里提出的)。有几个选项,最简单的似乎是 lib /list sqlite3.lib
,它应该列出静态库的对象并且不为导入库生成任何输出。
第二个问题的答案由Misrosoft给出,说明
LIB 的默认模式是构建或修改 COFF 对象库。当您未指定 /EXTRACT(将对象复制到文件)或 /DEF(构建导入库)时,此模式下的 LIB 运行s。
第三个问题在here之前讨论过,看来答案是“是”。想一想,静态库应该包含实际对象,而不包含有关 DLL 的信息(可以独立创建)。 lib 文件不适合在 运行 时间使用,因此成功链接静态库的唯一可能性应该是静态模式。
我目前的目标是编译 SQLite 库(C 语言),静态 linked 依赖于 Windows 和 MSVC 构建工具。我想获得一个 DLL 文件,它可能只依赖于核心 Windows/VC 组件,例如 kernel32 或 VC 运行时。 SQLite 库有几个具有外部依赖性的扩展,例如 Zipfile/zlib 或 ICU/ICU。我想在 sqlite3.dll 文件中静态 linked 启用所有必要代码的这些扩展。我可以用动态 linking 编译它就好了,但它需要单独的 dll 依赖文件,这是我想避免的。
Microsoft 有基本教程 Walkthrough: Create and use a static library,但我没有从 MSVC Build Tools 命令行中看到关于如何操作的明确说明。我的理解是,对于 link 静态依赖,静态库文件 .lib 是必需的。同时导入库也有.lib扩展名。
我有几个问题:
- 如何判断给定的 .lib 文件是导入库还是静态库? (我对具体说明感兴趣,可能涉及一些命令行 MS Build 或 Windows Resource Kit 工具。)
- 如何在给定单个源文件的情况下从命令行创建静态库与导入库,例如,SQLite3.c 没有外部依赖项?
- 如果所有依赖项都作为静态库提供,MS linker 将自动创建静态 linked dll,这是否正确? (比如,我在 SQLite 中启用 Zipfile 扩展,根据上一个问题的说明构建静态 zlib 库,并将其作为 MS Build Tools linker 的依赖项提供。)或者是否有特殊标志来请求静态link正在?
好的,经过进一步探索,我似乎找到了答案。
第一个问题是在 here, and there is an interesting comment related to libraries created with MinGW (lib /list sqlite3.lib
,它应该列出静态库的对象并且不为导入库生成任何输出。
第二个问题的答案由Misrosoft给出,说明
LIB 的默认模式是构建或修改 COFF 对象库。当您未指定 /EXTRACT(将对象复制到文件)或 /DEF(构建导入库)时,此模式下的 LIB 运行s。
第三个问题在here之前讨论过,看来答案是“是”。想一想,静态库应该包含实际对象,而不包含有关 DLL 的信息(可以独立创建)。 lib 文件不适合在 运行 时间使用,因此成功链接静态库的唯一可能性应该是静态模式。