26 个版本 (8 个稳定版)
新 5.1.1 | 2024 年 8 月 11 日 |
---|---|
5.1.1-Beta3 | 2024 年 7 月 14 日 |
5.0.9 | 2023 年 10 月 1 日 |
5.0.8 | 2023 年 6 月 22 日 |
5.0.3-Beta1 | 2021 年 11 月 2 日 |
#23 in 文本编辑器
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.lib 等 6 个更多.
VC-LTL - 编译更轻量级二进制文件的优雅方式。
我想变成一座石桥,历经五百年风雨,五百年阳光,五百年雨露,但她却走过了这座桥!
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,因为我希望帮助更多的人。
- QQ 群:633710173
1.1. VC-LTL 的原理
使用 VC-LTL 后,二进制文件将动态链接到 Windows 内置的 msvcrt.dll
或 ucrtbase.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
,选择适合您的版本,然后单击安装。
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
。
3.1.2. 配置项目属性
- C/C++ - 代码生成 -
运行库
调整为多线程 (/MT)
为了支持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.bat
或vcvars64.bat
并执行此脚本。该脚本将自动修改include
和lib
环境变量。
示例: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
编译,并且不需要重新编译依赖的静态库。
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吧。