对VC编译静态库和动态链接库时的/MT, /MTd, /MD, /MDd选项的理解

一般人都知道在Windows开发过程中,要实现代码重用,会封装成接口,再打包成库的形式,这就有了静态库和动态库。动态库的好处就是可以减少应用程序的大小,还有就是升级的时候只需要替换DLL即可,真正实现了模块化。

但这个静态库或动态库在使用C/C++运行时库的时候其实也有两种方式,一种是链接多线程静态库libcmt.lib和libcpmt.lib,使用/MT选项;另一种是链接多线程动态链接库MSVCRXX.DLL和MSVCPXX.DLL,使用/MD选项。后面多的那个小d其实是debug版本的意思,所以实际上只有MT和MD的区别。

这里解释一下,一个库就好比一个产品的模块,它可能会依赖其他的模块才能工作。打个比方,你买了一个电子产品,却没有配套电池,就相当于需要动态链接到电池;而如果买的时候,带了电池,就相当于这个电子产品是静态链接了电池。

也就是说:不仅应用程序链接的库有静态和动态之分,库本身也会去链接系统运行时库(这是必然的,因为要调用C/C++系统库函数),不同的链接方式导致了这种区别,一般说来,mt要比md类型的静态库要更大一些。

在使用VC创建一个静态库或动态链接库时,从项目的属性页里设置,如下图所示:

对VC编译静态库和动态链接库时的/MT, /MTd, /MD, /MDd选项的理解

参考链接:

https://blog.****.net/jigetage/article/details/80619386

https://blog.****.net/zxgis/article/details/8213718