VS关于中 MT和MD记录

这个问题卡了我好几次了,最早之前是写MFC遇到过,然后编译Readis+ActiveMQ+JsonCPP时候记得也遇到一次,再往后是之前写cmakelist 时候也被卡住过,昨天弄Boost 又被这个卡了一下。我就很服气。每次遇到每次的查一遍。一不做二不休,记录一下吧。

MT 和 MD到底是什么?以及MTd和MDd

首先我们要看这个东西在哪里?如下图:属性->c/c+±>代码生成->运行库
VS 项目属性页面
这里可以看到前面的中文解释,都写了多线程,那意味着选择哪一个都与单线程无关,但是我现在还是不明白这里的多线程是指什么??

MD和MT到底在做什么用?

引用一个小伙伴的描述1
区别是动态链接还是静态链接C运行时库(C runtime Library, CRT)。
如果是动态链接(MD/MDd),你的程序就依赖C运行时的动态链接库(比如VS2010的msvr100.dll),当你的程序在其他没有这个dll的电脑上运行就会出现错误(找不到这个dll)。
如果是静态链接(MT/MTD),C运行库直接链接到你的程序里,你的程序就不依赖C运行时库的dll了。

废话到此为止,下面就列举一下MFC,以及Boost编译过程中有关这个选项的操作,总体一点,只要有一个是MT或MTd的库,那么其他的也都要统一为MT或者MTd,又或者都统一为MD&MDd。
补充一点:后面的小弟9(d)是表示Debug模式的,即如果在release下请选择MT或MD。选错是什么样子自己尝试。

MFC 中引用了第三方Lib,这个Lib编译时是MT模式:

这时MFC则需要跟着修改为MT,可是只修改上图部分,是无法编译通过的,报fatal error C1189: #error: Please use the /MD switch for _AFXDLL builds这样的错误,是为什么呢?是因为MT的T表示是Static Call library,根据一个小伙伴博客描述2,在MT下VS会链接LIBCMT.lib这个静态库,而在MD模式下VS会链接MSVCRTD.lib这个静态导入库,然后导入MSVCRTD.dll,这里为什么说MSVCRTD.lib是静态导入库请参考我另一个博客。根据这个线索,我找到下图位置:
在这里插入图片描述
这里要与MT和MD对应一致,当使用MT是要改为在静态库中使用MFC,当使用MD是要改为在共享DLL中使用MFC。

Boost 编译时如何选择MT或MD

如何编译Boost 我参考了一位小伙伴的博客3,等他同意我再copy过来到我博客内吧。
其中编译命令为b2 install --toolset=msvc-14.1 --prefix="D:\ScanSource\download\Boost\vc141" link=static runtime-link=shared threading=multi debug release,而 runtime-link=shared这个参数就是改变MT和MD的地方,MT需将其改为static,MD保持原样shared。
Boost不同版本的build名字会有所不同,这里有参考了另一个小伙伴的博客4,MT时Build会多一个s的字样,详情请参考脚注4的博客吧。
例子:

MT
libboost_date_time-vc141-mt-s-x64-1_69.lib
Md
libboost_date_time-vc141-mt-x64-1_69.lib

CMakeLists 中 MT 或MD 的选择

这个是我师傅 Joey 直接发给我的,这里我就不查了,有兴趣的小伙伴可以自行检查其中缘由。

add_compile_options(
        $<$<CONFIG:>:/MT> #---------|
        $<$<CONFIG:Debug>:/MTd> #---|-- Statically link the runtime libraries
        $<$<CONFIG:Release>:/MT> #--|
    )

不在CMakelists 文件中添加这段话应该就是MD的情况。


  1. [andylan_zy] MTd与MDd的区别:https://blog.csdn.net/andylanzhiyong/article/details/81198884. ↩︎

  2. [那一剑的风情] visual studio运行时库MT、MTd、MD、MDd 的区别:https://www.cnblogs.com/SZxiaochun/p/7684371.html. ↩︎

  3. [luckyum] Boost编译与使用:https://zhuanlan.zhihu.com/p/85806857. ↩︎

  4. [YuWenHaiBo] boost库对应vs中的mt/mtd/md/mdd:https://www.jianshu.com/u/674aaf044c0c. ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值