VC-LTL5 icon indicating copy to clipboard operation
VC-LTL5 copied to clipboard

为MD/MDd提供一致性的体验

Open mingkuang-Chuyu opened this issue 1 year ago • 0 comments

背景

很多用户或许会疑问,如果编译时选择5.1兼容,但是使用MD编译。这时程序会怎么样,真的会兼容XP吗?需要额外依赖什么库?

从用户角度说使用 MD/MDd,额外依赖某些动态库是合理的。从技术角度做到不依赖动态库也不是特别容易。 这看起来没有问题,但是使用微软的动态库无法提供XP兼容,这违背用户使用VC-LTL的初衷。

因此我们希望重新调整MD/MDd下的使用体验。初步认为需要实现2点:

  1. 使用MD/MDd后将额外依赖某些动态库。用户需要为程序准备运行库后才能正常运行。
  2. 使用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

mingkuang-Chuyu avatar May 04 '24 06:05 mingkuang-Chuyu