VS系列工具作为目前微软主打的集成开发环境,在历经了近20多年的发展后,到如今已经可以 说是Windows平台上各种IDE环境中的翘楚了。很多别的开发工具已经难望其项背了,如今VS2010也已经面市很长时间了,但是因为笔者囊中羞涩, 无法升级硬件,所以也没有办法去进行那个180天的VS2010体验之旅了,实为憾事。当然这是别话,现在我主要使用的依然是VS2008,用它来开发我 想要的东西。当然主要指使用其中的VC++部分了。

  在用VS2005或VS2008的VC++开发产品时,经常遇到的一个问题就是最终编译出的可执行文件Exe、Dll、Ocx之类会需要 MSVCR90.dll、MSVCR80.dll等C库函数运行时Dll的支持,在一些较老的系统,如XP中,经常不具备这些新版本的运行库,导致产品发 布推广成为一个严重的问题。在2008年我还在开发一款网游时,也遇到了同样的问题,虽然想尽了办法,也无法屏蔽对这个动态库的引用,不得已,客户端就又 返回老的VS2003环境中进行编译开发,最终发布。

  本着刨根问底的精神,我仔细琢磨了一下这个问题,貌似可以通过与最终产品一起发布MicrosoftVisual C++ 2005/2008 RedistributablePackage库来解决这个问题,但是这个库的个头有可能是你最终产品的n倍(n>=5),这就像买了一部手机,却 给你了一座核电站来支持,最终用户是否能接受是个很纠结的问题。

  再后来,我发现可以使用VS2008自带的安装程序制作工具,生成一个最简的VC++Redistributable包,体积也很小,但是一样需要一个额外的安装包来支持你的最终产品,很多产品经理是不太喜欢这种形式的,所以此问题还是很纠结。

  在一次与一位网友讨论这个问题时,他兴奋的告诉我,他的总监解决了这个问题,方法就是修改一下编译选项,将/MD选项改为/MT选项,最终的可执行文 件就不会包含对那些VC运行时DLL的引用了,可以很方便的发布和部署。真是个非常棒的消息,让一个纠结了我两年多的问题得到了彻底解决。首先让我们来看 下这个云遮雾罩的编译开关究竟是干什么的?MSDN中的描述如下:

/MD
使应用程序使用运行时库的多线程并特定于DLL 的版本。定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj文件中。
用此选项编译的应用程序静态链接到MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR90.DLL, 中,该库必须在运行时对于与MSVCRT.lib 链接的应用程序可用。
当/MD 与 _STATIC_CPPLIB 预处理器定义 (/D_STATIC_CPPLIB)一起使用时,您的应用程序将与静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib)链接,但仍通过 msvcrt.lib 动态链接到主 CRT。
请注意,不支持_STATIC_CPPLIB 预处理器定义和 /clr 或 /clr:pure 编译器选项的组合。有关 /clr选项的限制的更多信息,请参见 /clr 限制。

/MDd
 定义_DEBUG、_MT 和 _DLL,并使应用程序使用运行时库的调试多线程并特定于 DLL 的版本。它还使编译器将库名MSVCRTD.lib 放入 .obj 文件中。

/MT
 使应用程序使用运行时库的多线程静态版本。定义_MT 并使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib解析外部符号。

/MTd
 定义_DEBUG 和 _MT。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用LIBCMTD.lib 解析外部符号。

/LD
创建DLL。
将/DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回TRUE 的 DllMain 函数。
链接DLL 启动代码。
如果命令行上未指定导出(.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL的应用程序。
将/Fe(命名 EXE 文件) 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll而不是基名称.exe。
除非显式指定/MD,否则将暗指 /MT。

/LDd
创建调试DLL。定义 _MT 和 _DEBUG。

看到这里,我恍然大悟,原来这个开关就是控制这个C运行时库的引用方式的,真是踏破铁鞋无觅处得来全不费工夫。

当然到这里先别忙着去修改你的项目属性中关于这个开关的选项,因为当你的项目也是一个LIB时,如果使用了/MT或/MTd选项时,最终的静态LIB中就 会出现LIBCMT.lib中的大量符号,导致在别的项目引用你的这个静态LIB时出现重复定义符号而无法链接的错误,怎么解决呢?其实继续看MSDN中 的帮助就可以得到答案:传递给链接器的给定调用的所有模块都必须使用相同的运行时库编译器选项(/MD、/MT、/LD)进行编译。

呵呵,原来如此,所有的模块保持一致就完了,但是静态的LIB貌似还是无法引用,问题依旧怎么办呢?那就是在引用了你自己的使用/MT或/MTd选项编译生成的静态LIB的项目中,不但指定对应的/MT或/MTd选项,而且需要忽略LIBCMT.lib库即可。

到这里这个很纠结的问题,总算是有一个非常完满的解决方法了。总结下来,其实也怪自己,《VC++语言参考手册》中其实早就描述过这个问题了,而我没有注 意,导致为这个非常基础的问题纠结了这么长的时间,实在是汗颜。在这里也非常感谢那位总监高手,轻松的解决了这个问题。也为以后大家也不再为这个问题发 愁,所以写成这篇文章,让大家作为参考。

转载于:https://www.cnblogs.com/mazhenyu/p/4722298.html

VS中的 MD/MT设置 【转】相关推荐

  1. VS中的 MD/MT设置

    VS系列工具作为目前微软主打的集成开发环境,在历经了近20多年的发展后,到如今已经可以说是Windows平台上各种IDE环境中的翘楚了.很多别的开发工具已经难望其项背了,如今VS2010也已经面市很长 ...

  2. 静态库、动态库、静态链接、动态链接、系统运行库混合、MD MT默认库冲突问题

    一.静态库项目 静态库lib:(注意和"静态运行库"区分)   就是.lib文件,一个.c或.cpp会编译成一个.obj,多个.obj可以组合成一个.lib库.lib=多个obj. ...

  3. 将Typora中的md文件导入博客中时,图片无法存入,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传]

    第一步:在Typora中打开文件-偏好设置-图像 具体配置如下: 第二步:下载PicGo,安装好后在这里导入好PicGo路径 第三步:点击验证图片上传选项 完成这些操作后直接导入md文件就可以显示图片 ...

  4. mdadm linux,mdadm命令_Linux mdadm 命令用法详解: mdadm是一个用于创建、管理、监控RAID设备的工具,它使用linux中的md驱动。...

    mdadm是一个用于创建.管理.监控RAID设备的工具,它使用linux中的md驱动. 基本语法 : mdadm [mode] [options] mdadm程序是一个独立的程序,能完成所有软件RAI ...

  5. word文档怎么给数字加千分符_Word中如何将文档中的金额数值设置为财务数字中的千分位格式...

    Word中如何将文档中的金额数值设置为财务数字中的千分位格式 时间:2015-06-10   作者:snow   来源:互联网 如图6‑19所示为某公司给省商务厅上报的2013年农产品现代流通综合试点 ...

  6. php request order,php.ini中的request_order推荐设置,requestorder_PHP教程

    php.ini中的request_order推荐设置,requestorder 今天刚刚安装dede,安装完成由一条错误信息(PHP 5.3 and above) Please set 'reques ...

  7. oracle自动分区maxvalue,分区表中的maxvalue参数设置-Oracle

    分区表中的maxvalue参数设置 结论:partition p3 values less than (maxvalue)   分区表中maxvalue如果用具体参数来代替,则整个表中可插入的最大值不 ...

  8. R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)

    R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体) 目录

  9. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字(设置expand=false之后返回的为series)、将series转化为dataframe

    pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字(设置expand=false之后返回的为series).把pandas series转化为panda ...

最新文章

  1. Vue打包后部署使用Nginx
  2. python彩票分析_数字化场景应用平台加持,开课吧学员Python挑战赛秀出代码精彩...
  3. 订单系统:从0到1设计思路
  4. (文末有福利)口罩检测覆盖公有云、私有化及SDK等形态,拿来即用精准高效
  5. Chrome的vimium插件的使用笔记
  6. 38、JAVA_WEB开发基础之下载功能
  7. 简单的SQL注入学习
  8. 将MyEclipse项目导入到Eclipse中
  9. jquery remove()不兼容问题解决方案
  10. Javascript 通用Excel导出函数
  11. 信用评分卡(python)
  12. Cocos Creator 实现大厅+子游戏模式
  13. linux设置双屏拼接_双屏、3屏拼接——A卡、N卡——Windows、Linux
  14. LM2596和LM2576区别,开关电源芯片LM2576和LM2596为什么开关频率越高,输出接电感值和电容值就越小呢?电感电容体积小,有利于减小开关电源整体模块的体积
  15. matlab仿真平台式惯导
  16. iOS 上的FlexBox布局
  17. PDF编辑方法,怎么给PDF添加页码
  18. 淘宝开店历程-致广大新开淘宝店主
  19. LoadRunner通过SiteScope监控MySQL的性能
  20. FPGA - 7系列 FPGA内部结构之CLB -01- CLB资源概述

热门文章

  1. LeetCode:Minimum Depth of Binary Tree,Maximum Depth of Binary Tree
  2. 西南石油大学计算机科学院信息,梁宗文 - 西南石油大学 - 计算机科学学院
  3. libboost_filesystem.so: undefined reference to
  4. matlab下文件夹下所有文件改名
  5. 台大李宏毅教授的神经网络教程
  6. Spring(IOC+AOP)
  7. js 得到select所有option里的值
  8. 2017.8.17 开始了我的QT 学习。
  9. iterp2函数--------二维数据内插值
  10. diag--创建对角矩阵