VC-LTL5
VC-LTL5 copied to clipboard
为MD/MDd提供一致性的体验
背景
很多用户或许会疑问,如果编译时选择5.1兼容,但是使用MD编译。这时程序会怎么样,真的会兼容XP吗?需要额外依赖什么库?
从用户角度说使用 MD/MDd,额外依赖某些动态库是合理的。从技术角度做到不依赖动态库也不是特别容易。
这看起来没有问题,但是使用微软的动态库无法提供XP兼容,这违背用户使用VC-LTL的初衷。
因此我们希望重新调整MD/MDd下的使用体验。初步认为需要实现2点:
- 使用
MD/MDd后将额外依赖某些动态库。用户需要为程序准备运行库后才能正常运行。 - 使用
MD/MDd后任然可以兼容XP等系统,符合用户的预期。
技术方案构想
- 使用
MD/MDd直接依赖ucrtbase.dll(就是统一废除MSVCRT.dll)- 这样 既将兼容标准对其微软,同时也完全兼容微软的DLL,大家可以在非必要的场景直接使用微软的。
- 我们提供ucrtbase.dll那一套DLL统一支持到Windows XP RTM
- 避免用户的尴尬,发现编译后任然不支持XP等老系统这个体验是糟糕的。
- 如何编译可以借鉴:https://github.com/sonyps5201314/msvcr14x
- 与微软原版相比,我们的不依赖API Sets
- 这样用户侧兼容老系统时可以不必带那一堆
api-ms-win-开头的dll,同时也能减少一些导入表体积。
- 这样用户侧兼容老系统时可以不必带那一堆
依赖结构如下:
初步计划中,除了砍掉API Sets与vcruntime相关DLL,其他结构与微软一模一样。
stateDiagram
direction LR
state VCRT/UCRT
{
vcruntime[d].lib --> ucrtbase.dll
ucrt[d].lib --> ucrtbase.dll
}
state CppRuntime
{
msvcprt[d].lib --> msvcp140.dll
msvcprt[d].lib --> msvcp140_1.dll
msvcprt[d].lib --> msvcp140_2.dll
msvcprt[d].lib --> msvcp140_atomic_wait.dll
msvcprt[d].lib --> msvcp140_codecvt_ids.dll
}
CppRuntime --> VCRT/UCRT
state ConcRT
{
concrt[d].lib --> concrt140.dll
}
ConcRT --> VCRT/UCRT
ConcRT --> CppRuntime
state WinRT
{
vccorlib[d].lib --> wincorlib.dll
}
state MFC
{
mfc140.dll
mfc140u.dll
mfcm140.dll
mfcm140u.dll
}
MFC --> VCRT/UCRT
MFC --> CppRuntime
state AMP/OPENMP
{
vcamp140.dll
vcomp140.dll
}
AMP/OPENMP --> VCRT/UCRT