1. “修改了当前程序的vc运行库配置,问题解决
(1)修改:项目-属性-配置属性-C/C++-代码生成-运行库,将其改为“多线程调试(/MTd)”。”
其中:
- 【多线程/MT】
- 【多线程调试/MTd】-----
- 【多线程DLL/MD(默认)】-------
- 【多线程调试DLL/MDd】
/MT、/MTd、/MD、/MDd什么意思:
四个选项又是什么意思,有什么区别?接下来详细讨论。
先奉上一个写得非常详细的博客链接:你所不知道的C和C++运行库,这个文章中写得非常详细,本文也主要参考了这篇文章。
还有这篇C Runtime Library 的来历。
(1)VS项目属性中的C/C++运行库:你不知道的C和C++运行库。
为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C库函数。C标准仅仅定义了函数原型,并没有提供实现。因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run Time Libray) ,简称CRT。对于VC++编译器来说,它提供的CRT库支持C标准定义的标准C函数,同时也有一些专门针对windows系统特别设计的函数。
与C语言类似,C++也定义了自己的标准,同时提供相关支持库,我们把它称为C++运行时库或C++标准库。
由于C++对C的兼容性,C++标准库包括了C标准库,除此之外还包括IO流和标准模板库STL。
VC++在何处实现C和C++运行库:对应的MSVC编译器
VC++完美的支持C和C++标准,因此也就按照C和C++的标准定义的函数原型实现了上述运行时库。为了方便有不同需求的客户的使用,VC++分别实现了动态链接库DLL版本和静态库LIB版本。同时为了支持程序调试且不影响程序的性能,又分别提供了对应的调试版本。调试版本的名称在Release版本名称后添了字母d。
对于C运行时库CRT,VC6.0、VC2005、VC2008和VC2010均提供了DLL版本和LIB版本。
(1)上述各个编译器提供的LIB版的CRT库,均实现在libcmt.lib。对应的调试版名称为libcmtd.lib。
(2)上述各个编译器提供的DLL版本名称根据编译器不同而不同,我们可以从名称上加以分辨。
VC6.使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.DLL。
VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL。
VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL。
VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL。典型的dll:msvcr2019.dll以及调试版本msvcr2019d.dll
C++标准兼容C标准,但VC各版本将C++编译器使用的C标准库与C编译器使用的C运行库一起实现,它们使用相同的运行库。
对于C++标准库中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。
(1)LIB版均实现在libcpmt.lib中,对应的调试版本为libcpmtd.lib。不同版本的编译器实现的DLL也不相同。
VC6.使用的C++类库的 DLL版本在MSVCP60.DLL中实现, 对应调试版本为MSVCP60D.LIB。
VC2005使用的C++类库的DLL版本在MSVCP80.DLL中实现,对应调试版本为MSVCP80.DLL。
VC2008使用的C++类库的 DLL版本在MSVCP90.DLL中实现,对应调试版本为MSVCP90D.DLL。
VC2010使用的C++类库的DLL版本在MSVCP100.DLL中实现,对应调试版本为MSVCP100D.DLL。
参考:
https://learn.microsoft.com/en-us/answers/questions/240332/assert-when-using-mtd-dynamic-library
https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-170
参考博客:https://blog.csdn.net/cnhk1225/article/details/78330322
标签:__,运行库,acrt,C++,DLL,header,编译器,版本,调试 From: https://www.cnblogs.com/icmzn/p/18610702