本文是对http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html的翻译,如有错误,还请指正

c/c++运行库(runtime library)包括许多基本的功能,像内存分配、输出和字符串操作(复制、计算长度)等等

当建立了一个c/c++的应用程序或库时,你必须选中c/c++运行库,在vs2005中,你可以这样选中这种按钮:Project->Properties...->Configuration Properties->C/C++->Code Generation->Runtime Library:

这里有4种选择:

1 多线程(/MT)

2 多线程调试(/MTD)

3 多线程动态链接库dll(/MD)

4 多线程动态链接库调试(/MDD)

c++的运行库依赖于c的运行库。c的运行库版本必须和c++的运行库版本匹配。因此,这些选项应用于c和c++的运行库中。

在之前vs的版本中,这些都是单线程的。那些版本会比多线程的执行的速度更快。但是,在多线程的应用程序中,用他们并不安全。我想,单线程库在减少是因为多核现在已经成为普遍的存在。而且多线程应用程序需要利用多核。

(In previous versions of Visual Studio, you had additional options that were single-threaded. These versions would execute faster on a single core than the multi-threaded versions. However, they were not safe to use in a multi-threaded application. I'm guessing these libraries were dropped since multiple cores are quickly becoming ubiquitous and multi-threaded applications are needed to take advantage of these extra cores.)

这两种变量会有四种选择

  • 调试版本(debug) vs  发布版本(release)
  • 动态链接库(dll)vs 静态库

第一种变量很简单,在不交给顾客的内部软件中应用调试版。调试的运行库不能合法的包含你的应用程序。这么说吧,你不能将软件的debug版本交给顾客。它应该是运行库的release版本

debug运行库让你会的一些有用的调试帮助,比如错误报告和跟踪内存泄露,想了解更多的debug功能,请看http://msdn.microsoft.com/en-us/library/zh712wwf%28VS.80%29.aspx

下一个变量就是动态链接库(dll)或静态库了。通常来说,我们应当使用dll,当出现下面请看时,你可以考虑静态库版本:

  • 你有一个小的应用程序,你不想浪费内存让运行库调用一些你不想要的东西上面
  • 你想要一个简单的应用程序不依赖于额外运行库的dll

当你的应用程序不需要其他库时这些指令运行的非常好。但这很少发生。在应用程序中使用多余一个运行库版本Microsoft列出了几点模糊的警告在他们的文档里。

目的就是在你的整个应用程序里只使用一种运行库。

但这几乎不可能因为因为你对别的类库用了什么库时没有权限的。比如说,openGL(open graphic library)需要使用类库。如果你的应用程序或是使用的其他类库没有和openGL使用同样的类库,那么你就在同时用着几个类库。

我们怎么知道某个exe,dll,lib,obj使用了哪个类库呢,使用下面这条命令:、

dumpbin /all XXXX | find /i "msvcr"

XXX表示你想知道的exe/dll/lib/obj

想知道运行的结果代表什么,可参照:http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx

如果你什么也没得到,很可能你现在用的是一个静态库。

甚至在你知道用的是哪个运行库,你会发现要使得应用程序只用一个运行库也是不可能的。如果如果你匹配运行库,会发现,有可能一个类库用的是vs7.0的版本(msvct.dll)但是你只能访问vs8.0的类库。

所以,除了某些特定情况,类库混在一起用关系不大。一个好的类库应该避开这些情况,然后类库匹配的时候就没多大关系了。

选择正确的C/C++ runtime library的更多相关文章

  1. CRT (C run-time library)

    一 产生 运行时库是程序在运行时所需要的库文件,通常以LIB或DLL形式提供. C运行时库就是C run-time library,诞生于20世纪70年代,是C而非C++语言世界的概念,C程序运行时需 ...

  2. <转>C Runtime Library(MSVCRT)来历

    (转载)C Runtime Library(MSVCRT)来历   msvcrt.dll (名称:Microsoft C Runtime Library)提供了printf,malloc,strcpy ...

  3. Microsoft Visual C++ Runtime Library Runtime Error的解决的方法

    打开浏览器时,出现Microsoft Visual C++ Runtime Library Runtime Error错误,初步预计是软件冲突,可能有多种出错的方式,我的是浏览器自己主动关闭. 一. ...

  4. Microsoft Visual C++ Runtime Library Runtime Error解决的方式

    打开浏览器时,出现Microsoft Visual C++ Runtime Library Runtime Error错误,初步预计是软件冲突,可能有多种出错的方式,我的是浏览器自己主动关闭. 一. ...

  5. C Runtime Library来历, API, MFC, ATL关系

    首先说明,我google了半天,想找到英文的关于这个资料,但是实在找不到,只好转载国人的讨论. CRT原先是指Microsoft开发的C Runtime Library,用于操作系统的开发及运行.后来 ...

  6. 【转】C Runtime Library的来历

    由于我看到的文章也是转载且未提供原文链接,所以这里没有提供原文链接! msvcrt.dll(名称:Microsoft C Runtime Library)提供了printf,malloc,strcpy ...

  7. C Runtime Library、C  Runtime

    C Runtime Library.C Runtime   1)运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些 ...

  8. C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...

  9. (转)C# 选择正确的集合

    原文: http://www.cnblogs.com/luminji/archive/2011/03/24/1993393.html 要选择正确的集合,我们首先要了解一些数据结构的知识.所谓数据结构, ...

随机推荐

  1. STM32_1 搭建工程框架

    搭建系统框架 -- 创建系统文件夹 -- 拷贝stm32库文件 -- 将文件添加至工程 -- 配置工程环境 1. 创建工程文件夹 找一个工程目录,我就在 stm32/Code 下创建一个模板工程Tem ...

  2. c指针学习

    #include <stdio.h> void main() { int a1=10; int a2=11; int * pa1, * pa2; pa1 = &a1; pa2 = ...

  3. python 感叹号的作用

    1.     !表示反转逻辑表达式的值 2.      打印格式控制中: x!r代表repr(x),x!s代表str(x),x!a代表ascii(x)

  4. FPGA算法学习(1) -- Cordic(Verilog实现)

    上两篇博文Cordic算法--圆周系统之旋转模式.Cordic算法--圆周系统之向量模式做了理论分析和实现,但是所用到的变量依然是浮点型,而cordic真正的用处是基于FPGA等只能处理定点的平台.只 ...

  5. gp与 pg 查询进程

    select now()-query_start as cost_time,* from pg_stat_activity where current_query not in ( '<IDLE ...

  6. Mybatis中Mapper的Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

    还有很多其他的标签,<resultMap>.<parameterMap>.<sql>.<include>.<selectKey>,加上动态s ...

  7. Apache Tomcat 8.5 安全配置与高并发优化

    通常我们在生产环境中,Tomcat的默认配置显然不能满足我们的产品需求,所以很多时候都需要对Tomcat的配置进行调优,以下综合我自己的经验来配置 Tomcat 安全与优化情况,如果你有更好的方案,请 ...

  8. C#调用c++类的导出函数

    C# 需要调用C++东西,但是有不想做成COM,就只好先导出类中的函数处理. 不能直接调用,需单独导出函数 参考:http://blog.csdn.net/cartzhang/article/deta ...

  9. [Jmeter]jmeter之BeanShell Sampler测试应用

    前言: 在做接口测试的时候,有些接口做了签名校验,而签名是根据某算法进行加密,这时候,简单的接口测试工具无法完成该工作,所以想到了Jmeter,他是java编写,有强大的扩展性,足矣完成我们需要的操作 ...

  10. E2E test protractor selenium

    E2E Test和传统的Unit Test不同的是:(1)不涉及代码层面,不会去测试某段代码是否正确或者某行代码是否被覆盖(2)它是从用户的角度出发,用来测试一个应用的流程是否符合预期. 一 Sele ...