26 个版本 (8 个稳定版)

5.1.1 2024 年 8 月 11 日
5.1.1-Beta32024 年 7 月 14 日
5.0.9 2023 年 10 月 1 日
5.0.8 2023 年 6 月 22 日
5.0.3-Beta12021 年 11 月 2 日

#23 in 文本编辑器

Download history 330/week @ 2024-04-26 405/week @ 2024-05-03 371/week @ 2024-05-10 501/week @ 2024-05-17 459/week @ 2024-05-24 409/week @ 2024-05-31 412/week @ 2024-06-07 322/week @ 2024-06-14 306/week @ 2024-06-21 290/week @ 2024-06-28 388/week @ 2024-07-05 266/week @ 2024-07-12 343/week @ 2024-07-19 389/week @ 2024-07-26 266/week @ 2024-08-02 304/week @ 2024-08-09

1,342 每月下载量
用于 4 个 crate (2 个直接使用)

自定义许可证

35MB
114

包含 (静态库,8.5MB) ucrt.lib,(静态库,6MB) libucrt.lib,(静态库,8MB) ucrt.lib,(静态库,7MB) libucrt.lib,(静态库,1MB) vcruntime.lib,(静态库,765KB) libvcruntime.lib6 个更多.

VC-LTL - 编译更轻量级二进制文件的优雅方式。

license downloads contributors release nuget crates.io Build&Test

Logo
我想变成一座石桥,历经五百年风雨,五百年阳光,五百年雨露,但她却走过了这座桥!

1. 关于 VC-LTL

VC-LTL 是一个基于 MS VCRT 的开源 CRT 库,它可以减小程序二进制大小,并告别 Microsoft 运行时 DLL,如 msvcr120.dll、api-ms-win-crt-time-l1-1-0.dll 等依赖项。

VC-LTL 最初是 Dism++ 运行时的专用库,于 2017 年 3 月 6 日从 Dism++ 源代码中独立出来并开源。

大型项目中有很多模块。如果所有二进制文件都使用静态编译,将会占用大量磁盘空间,最终可能会因为纤维局部存储 (FLS) 限制而崩溃。

但 VC-LTL 可以让您的项目使用 Windows 内置的 msvcrt.dll。它有效地解决了 C 运行时部署问题和纤维局部存储 (FLS) 限制问题,并大大减小了二进制文件大小。真是一个实用的库!

任何人都可以免费使用它,甚至可以用于商业用途。当然,我希望如果您在项目中提到了 VC-LTL,因为我希望帮助更多的人。

1.1. VC-LTL 的原理

使用 VC-LTL 后,二进制文件将动态链接到 Windows 内置的 msvcrt.dllucrtbase.dll,以减小二进制文件大小。如果您在项目中使用 C 运行时、STL 或 MFC,则通常可以使用 VC-LTL。

在使用VC-LTL后,如果从C++源代码编译,二进制文件的大小将减少约30%,如果从纯C源代码编译,则减少约50%。

1.2. 突出

  • 晚起的鸟儿也有虫虫吃,优雅的引用方式,仅添加一个属性表就能享受极致的体积体验。
  • 无缝使用最新C/C++库以及最新编译器,尽情的使用最新规范。神马异常流防护(guard:cf)、静态对象线程安全初始化(threadSafeInit)……统统放马过来吧!!
  • 拥有比微软原版更好的兼容性,即使想兼容Windows XP RTM也可以安心的对新编译器说“Yes”。
  • 完全的开放代码,广泛的接受用户意见,希望大家能踊跃的 pull requests,为VC-LTL添砖加瓦。

让我们告别Visual Studio 2008。

2. VC-LTL兼容性

模块 5.1.2600.0/5.2.3790.0 6.0.6000.0 6.2.9200.0 10.0.10240.0 文件
依赖 msvcrt.dll msvcrt.dll msvcrt.dll ucrtbase.dll
VCRT 100% 100% 100% 100% vcruntime[d].lib、libvcruntime[d].lib
UCRT 97.458% 97.676% 97.676% 100% libucrt[d].lib、ucrt[d].lib
WinRT X X 99.609% 100% vccorlib.lib (Windows 8.1或更高版本)
STL 100% 100% 100% 100%
ConcRT 100% 100% 100% 100%
ATL 100% 100% 100% 100%
MFC 100% 100% 100% 100%
AMP X X X 100% 需要从Visual C++运行时获取vcamp140.dll
OpenMP 100% 100% 100% 100% 需要从Visual C++运行时获取vcomp140.dll

2.1. ABI兼容性

从VC-LTL 5.0开始,ABI与微软兼容。你可以使用静态库与VC-LTL链接,无需重新编译!

此外,为了提供行为的一致性,还提供了一个调试版本的库。它仍将使用msvcrt.dll或ucrtbase.dll,但不支持堆调试功能。如果您需要使用堆调试,请禁用VC-LTL。

2.2. 支持的Visual Studio版本

  • Visual Studio 2015(支持Clang与Microsoft CodeGen,Clang 3.7与Microsoft CodeGen,Clang-LLVM)
  • Visual Studio 2017(支持Clang与Microsoft CodeGen,Clang-LLVM)
  • Visual Studio 2019(支持Clang-LLVM)
  • Visual Studio 2022

2.3. 支持的构建工具

构建工具 辅助工具
Visual Studio NuGet或Visual Studio的VC-LTL辅助工具.props
CMake cmake.cmake的VC-LTL辅助工具
NMake, CL nmake.cmd/VC-LTL辅助工具.nmake.ps1
QMake qmake.pri的VC-LTL辅助工具
Rust crate

2.4. 支持的Windows版本

操作系统 x86 x64 arm arm64
Windows XP, Windows Server 2003 - -
Windows Vista, Windows Server 2008 - -
Windows 7, Windows Server 2008 R2 - -
Windows 8, Windows Server 2012, Windows RT -
Windows 8.1, Windows Server 2012 R2, Windows RT 8.1 -
Windows 10, Windows Server 2016, Windows Server 2019
Windows 11

提示:如果您需要编译Windows XP兼容的应用程序(5.1.2600.0/5.2.3790.0),请别忘了使用YY-Thunks

使用VC-LTL编译的二进制文件与Windows XP和更高版本兼容,即使在未安装任何热修复的环境中也是如此。

3. 如何使用?

我们将进入主题,我们为您的参考准备了丰富的VC-LTL示例,并欢迎您加入我们的QQ群(633710173)。

3.1. 在Visual Studio中使用VC-LTL

3.1.1. 选择引用模式

3.1.1.1. 通过NuGet引用(推荐)

右键单击项目,选择“管理NuGet包”,然后搜索VC-LTL,选择适合您的版本,然后单击安装。

InstallByNuGet

3.1.1.2. 通过注册表引用

如果您已将VC-LTL二进制文件解压缩到D:\Src\VC-LTL,请双击D:\Src\VC-LTL\Install.cmd

脚本将信息保存到注册表中:HKCU\Code\VC-LTL

VC-LTL helper for Visual Studio.props复制到您的项目中,然后打开属性管理器(视图 - 属性管理器),在发布配置上右键单击,点击添加现有属性表...,最后选择VC-LTL helper for Visual Studio.props

AddShared

3.1.2. 配置项目属性

  • C/C++ - 代码生成 -运行库调整为多线程 (/MT)

ConfigurationProject

为了支持XP,请右键单击项目,属性 - NuGet包设置 - VC-LTL - 目标CRT版本 - "msvcrt 5.1.2600.0"。此外,建议您安装YY-Thunks。

3.2. 在CMake中使用VC-LTL

如果您已将VC-LTL二进制文件解压缩到D:\Src\VC-LTL,请双击D:\Src\VC-LTL\Install.cmd

脚本将信息保存到注册表中:HKCU\Code\VC-LTL

3.2.1. 添加VC-LTL模块文件

VC-LTL helper for cmake.cmake复制到您的项目中。然后向CMakeLists.txt添加include("VC-LTL helper for cmake.cmake")

示例

cmake_minimum_required(VERSION 3.5.2)
project(ltltest)

include("VC-LTL helper for cmake.cmake")

add_subdirectory(src)

3.2.2. 修改配置

建议在使用VC-LTL编译项目时使用/MT。为了支持XP,请将VC-LTL helper for cmake.cmake修改为启用set(WindowsTargetPlatformMinVersion "5.1.2600.0")。此外,建议您安装YY-Thunks。

3.3. 在NMake/CL中使用VC-LTL

3.3.1. 运行VC-LTL命令脚本

如果您已将VC-LTL二进制文件解压缩到D:\Src\VC-LTL,请双击D:\Src\VC-LTL\Install.cmd

脚本将信息保存到注册表中:HKCU\Code\VC-LTL

VC-LTL helper for nmake.cmd复制到您的项目中。运行vcvars32.batvcvars64.bat并执行此脚本。该脚本将自动修改includelib环境变量。

示例:cmd

call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
call "D:\VC-LTL\VC-LTL helper for nmake.cmd"

nmake /f Test.mak

示例:powershell

$BuiltInVsWhereExe = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$LatestVisualStudioRoot = & $BuiltInVsWhereExe -latest -prerelease -property installationPath

# x86、amd64、arm、arm64
& "$LatestVisualStudioRoot\Common7\Tools\Launch-VsDevShell.ps1" -arch x86
& D:\VC-LTL\VC-LTL helper for nmake.ps1"

& nmake /f Test.mak

3.3.2. 修改配置

建议在使用VC-LTL编译项目时使用/MT。为了支持XP,请将VC-LTL helper for nmake.cmd修改为启用set WindowsTargetPlatformMinVersion=5.1.2600.0。此外,建议您安装YY-Thunks。

3.4. 重新构建

文件大小变小了吗?如果编译失败,请参阅4. FAQ。您还可以反馈并与我们一起改进VC-LTL。

建议使用VC-LTL 5.0编译时使用/MT编译,并且不需要重新编译依赖的静态库。

AppBuildByVC-LTL

4. FAQ

4.1. 未共享到msvcrt.dll/ucrtbase.dll

原因

未正确引用VC-LTL。建议查看链接日志,是否链接了VC-LTL的lib。

解决方案

1:请务必确保 VC-LTL helper for Visual Studio.props 已经添加到工程。

2:确保以下设置正确:

  • VC++ 目录 - 包含目录 - 【√ 从父项或项目默认设置继承(I)】
  • VC++ 目录 - 库目录 - 【√ 从父项或项目默认设置继承(I)】

5. 已知问题

  • Bug 22,VC-LTL的Debug模式不支持堆调试功能也无法使用ASAN
    • 如果您需要使用这些功能,可以针对Debug配置关闭VC-LTL。
  • Bug 60,msvcrt模式下locale相关函数(如setlocale、std::locale)无法指定为区域为 .utf8
    • 如果需求如此必须使用,建议使用VC-LTL的UCRT模式(使用后将依赖ucrtbase.dll),如果不想依赖DLL就直接静态链接微软原版CRT吧。

附录 - 第三方许可证

无运行时依赖