Vc2013实战(2) 彻底厘清C运行库的涵义


一、什么叫C运行库:
1、由来:
   C运行库,即C Runtime library,简称CRT。
   C语言是小内核语言,其本身只处理少量的关键字、数据类型和基本流程控制。其内核开发出来后,C语言重写了Unix的90%的系统函数,并提取最常用的部分,形成了头文件和Lib库,C运行库产生。换言之,此时使用C语言本身和C运行库,在Unix下开发。
   运行库包括C程序运行的最基本的函数,规模几近数千个函数。比如通过main开始运行,exit退出,printf之类的函数、错误处理等。换言之,没有运行库std,C程序根本不能运行。
2、Ansi C标准和 Standard Library
   C逐渐流行,不同的编译厂商,在不同的平台上实现了Standard Library,当然都是平台相关的,这对于程序员而言显然带来紊乱。于是有了Ansi C标准,该标准除了详细定义C语言各要素的具体含义外, 同时规定了Standard Library的标准。因此Std由各编译厂商根据Ansi标准提供。
3、C++的标准库:
   C++的Standard C++ Library,包括上面的C 运行库和Stl,显然,由于C++是C的超级,C运行库被简单的加入,没有必要另写一套。

二、VC++里的C运行库
在vs2013中,同一解决方案,每个项目应使用相同的C运行库。我们在解决方案资源管理器中,选中项目|右键|属性,打开该项目的属性页:配置属性|C/C++|代码生成,可以选择"运行库",有四个选择:多线程(/MT),多线程调试(/MTD),多线程Dll(/MD),多线程Dll调试(/MDD)。这四个选择,MT和MD是release版本,MTD和MDD是Debug版本,所以我们只要弄清MT和MD的区别。  /MT 即multithread, static version,多线程静态版本。这种方式下,编译器静态的链接LIBCMT.lib。/MD是multithread- and DLL-specific version,多线程DLL版本。这种方式下,编译器链接MSVCRT.lib,而动态的使用MSVCRT*.dll。它们的区别是:
1、静态运行时,使用LIBCMT.lib。动态运行时使用MSVCRT.lib+MSVCRT*.dll。
2、使用静态运行库,CRT会链接进EXE文件,生成的EXE文件大些,但运行时不用加载CRT。使用动态运行库,编译的EXE文件小些,但程序启动后需要Load CRT,加载MSVCRT*.dll文件,性能略低。

三、VC中C运行库设定的铁律:
1、同一解决方案,各项目使用相同的运行库设置,否则不仅可能无法生成,即使通过编译,也会带来多种潜在隐患
2、使用第三方库,必须编译和项目设置相同的版本,如果不能,则只能弃用。3、如果使用动态运行时/MD或/MDD,则MFC应用程序,只能选择在共享Dll中使用MFC,不能静态链接MFC。反过来说,如果MFC要静态链接到Exe文件,则必须使用/MT或/MTD


四、常见的编译错误:

当解决方案不同项目的运行库设置不同的时候,首先会出现一堆类似如下的错误:
MSVCRTD.lib(MSVCR120D.dll) : error LNK2005: _memmove 已经在 libcmtd.lib(memmove.obj) 中定义
然后:
LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
fatal error LNK1169: 找到一个或多个多重定义的符号

原因很简单,Mfc应用和Dll项目之间,在链接另一个项目的类似lib、obj时,很明显,由于运行库设置不同,编译器面对两个运行库,选择链接哪一个运行库的函数,显然是很困难的事情,只好简单的告诉你:编译失败。将两者的运行库设置改为一致...无论哪一个,一致就好,问题解决。一些文章提到的另外两种解决方式:1、人为的忽略一个库;2、强制编译,都是有隐患的,某种意义上来说,是误导。请遵循上面提到的铁律:同一解决方案中,所有项目使用相同的运行库设置。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VC运行库修复工具是一款非常实用的软件工具,它的主要作用是解决在安装某些应用程序或打开某些软件时出现的各种运行库错误问题。对于一些特定的运行库问题,我们通常需要下载并安装相应的运行库文件,但在一些复杂情况下,这种方式并不能解决问题,而VC运行库修复工具就可以派上用场了。 VC运行库修复工具是一款免费的软件程序,可以在多种操作系统上运行,使用方法也非常简单。只需要下载并安装该工具,打开它,然后根据提示进行相应的操作即可。该工具可以检测并自动修复多种VC运行库问题,而且速度非常快,用户可以在几分钟内完成修复过程,非常方便快捷。 不仅如此,该工具还具有良好的兼容性,可以修复多个版本的VC运行库问题,而且修复的效果非常稳定可靠。使用该工具可以避免一些软件运行时出现的各种奇怪问题,大大提升了操作系统的稳定性和程序的运行效率。 总之,VC运行库修复工具是一款非常实用的软件工具,而且免费使用。很多用户在解决VC运行库问题时都会选择使用该工具,效果十分显著。如果你也遇到了VC运行库问题,不妨尝试一下这个免费的修复工具,相信你也会得到意想不到的好处。 ### 回答2: VC(Visual C++)运行库修复工具是一个免费的软件,主要用于修复Microsoft Visual C++运行库中的一些常见错误。这些错误通常会导致程序无法正常运行,包括程序崩溃、程序无响应等。VC运行库修复工具的主要功能是检测和修复这些错误,帮助用户解决程序运行中的问题。 VC运行库修复工具的安装非常简单,用户只需要下载并安装即可。一旦安装完成,工具会自动扫描并检测存在的问题。如果发现存在问题,则会自动尝试修复。工具非常容易使用,用户只需按照界面指示完成相应步骤即可。 由于VC运行库修复工具是免费的,因此用户可以随时使用,而不需要支付任何费用。该工具可以帮助用户节省时间和金钱,避免不必要的烦恼和麻烦。同时,这个工具也是非常有效的,可以大大提高程序的运行效率和稳定性。 总之,VC运行库修复工具是一款非常好用的免费软件,可以帮助用户轻松解决程序运行中的常见问题。它不仅非常简单易用,而且非常强大有效,无疑是程序员和普通用户必备的工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值