api-ms-win-crt-***.dll, api-ms-win-core-***.dll,win7以后kernel.dll,msvc*.dll的改变。api-ms-win-crt-***.dll 有问题就是 c++ redist 版本过低。
api-ms-win-crt-***-|1-1-0.dll是redistributable c++的一部分。以往只会因为msvc*NNN.dll才要去找对应的redistributable c++版本安装。现在各种工具的最新版都用最新的vc来编译,导致在老机器上无法运行。一直在老win7上使用旧版工具的我,因为今日要用最新版的codeblocks-20+mingw8.1,才发现运行不了,报错_o__configure_narrow_argv无法定位在api-ms-win-crt-private-|1-1-0.dll。这样的错,在linux下日常都会碰上,因为glibc的版本过底,编译或运行应用时报符号无法定位。没想到windows也会有一堆api-ms-win-crt-***.dll的运行时库。相近命名的还有一堆api-ms-win-core-***.dll。
一谷一百只能搜出下载某个丢失的dll的链接,完全找不到任何官方解释的用途,但终于找到了一篇https://www.nirsoft.net/articles/windows_7_kernel_architecture_changes.html
相关的解释。文章标题有点不准确,应该是kernel.dll内核外壳层,是关于它的结构体系,它的职能就好比linux的system calls。大意是从winodws7开始,我们以前熟知的win32 api移居到一堆api-ms-win-core-***.dll上,原本的熟知win32 api链接库仍旧沿用,但对于api入口只作为简单的跳转表,直接jmp到api-ms-win-core-***.dll的执行地址上。我们的应用不直接链接到api-ms-win-core-***.dll上,可以这样认为,原本的api执行体放到了api-ms-win-core-***.dll。同理可以理解成api-ms-win-crt-***.dll就是运行在winodwws7以后系统上的msvc*.dll的执行体。以往又不同版本vc编译执行文件,依赖msvc*NNN.dll,现在却是msvc*.dll不分版本,依赖的api-ms-win-crt-***.dll分不同版本。这堆dll命名至今还是1-1-0,但签名发布的版本是在变的,新版本还增加了函数。我碰到的问题是无法定位符号_o__configure_narrow_argv,c++redist只安装到2015,安装2017后问题解决了。