介绍使用 Visual C++ 生成程序时,默认情况下程序将连接的 C 和 c + + 库


摘要


本文介绍了默认库 LIBC [D]。LIB,LIBCMT [D]。LIB,LIBCI [D]。LIB,LIBCIMT [D]。LIB,LIBCP [D]。LIB,LIBCPMT [D]。LIB,MSVCRT [D]。LIB,MSVCIRT [D]。LIB 和 MSVCPRT [D]。当使用 Visual C++ 构建程序将链接的 LIB。

更多信息


在构建版本 (或调试) 份项目中 Visual C++,一个基本的 C 运行时库 (LIBC [D]。LIB,LIBCMT [D]。LIB 和 MSVCRT [D]。LIB) 链接,默认情况下,选择根据编译器选项 (单线程 < ML [d] >、 多线程 < MT [d] >,或多线程的 DLL < MD [d] >)。也可能这取决于您在您的代码中使用的标题链接库和标准 c + + 库或从旧 iostream 库。例如,请考虑以下情况:

案例 1: 示例程序 test1.cpp

// test1.cppvoid main(){}
  • 如果使用/ML (或/MLd,调试版本)生成 test1.cpp 编译器选项,则程序将与 LIBC链接。LIB (或 LIBCD。LIB,为调试生成),另外向其他库。
    注意:在 Visual C++ 2005年及更高版本的 Visual C++ 删除/ML/MLd库对静态单线程库的编译器选项。
  • 如果生成使用/MT (或/MTd,调试版本) 的 test1.cpp 编译器选项,则程序将 LIBCMT 与链接。LIB (或 LIBCMTD。LIB,为调试生成),另外向其他库。
  • 如果生成使用/MD (或/MDd,调试版本) 的 test1.cpp 编译器选项,则程序将链接与 MSVCRT。LIB (或 MSVCRTD。LIB,为调试生成),另外向其他库。在这种情况下,您的程序将取决于 MSVCRT。DLL (或 MSVCRTD。DLL 的调试版本)。

案例 2: 示例程序 test2.cpp

   // test2.cpp   #include <iostream>   void main()   {   }
  • 如果生成使用/ML (或/MLd,调试版本) 的 test2.cpp 编译器选项,则程序将链接与 LIBC。LIB (或 LIBCD。为调试版本的 LIB) 和 LIBCP。LIB (或 LIBCPD。LIB,为调试生成),另外向其他库。
    注意:在 Visual C++ 2005年及更高版本的 Visual C++ 删除/ML/MLd库对静态单线程库的编译器选项。
  • 如果生成使用/MT (或/MTd,调试版本) 的 test2.cpp 编译器选项,则程序将 LIBCMT 与链接。LIB (或 LIBCMTD。为调试版本的 LIB) 和 LIBCPMT。LIB (或 LIBCPMTD。LIB,为调试生成),另外向其他库。
  • 如果生成使用/MD (或/MDd,调试版本) 的 test2.cpp 编译器选项,则程序将链接与 MSVCRT。LIB (或 MSVCRTD。为调试版本的 LIB) 和 MSVCPRT。LIB (或 MSVCPRTD。LIB,为调试生成),另外向其他库。对于 Microsoft Visual C++ 2008,将取决于 MSVCR90 程序。DLL 和 MSVCP90。DLL (或 MSVCR90D。DLL 和 MSVCP90D。DLL 的调试版本)。对于 Microsoft Visual C++ 2005,程序将取决于 MSVCR80。DLL 和 MSVCP80。DLL (或 MSVCR80D。DLL 和 MSVCP80D。DLL 的调试版本)。对于 Microsoft Visual C++ 2003,您的程序将取决于 MSVCR71。DLL 和 MSVCP71。DLL (或 MSVCR71D。DLL 和 MSVCP71D。DLL 的调试版本)。对于 Microsoft Visual C++ 2002,您的程序将取决于 MSVCR70。DLL 和 MSVCP70。DLL (或 MSVCR70D。DLL 和 MSVCP70D。DLL 的调试版本)。对于 Microsoft Visual C++ 6.0 中,您的程序将取决于 MSVCRT。DLL 和 MSVCP60。DLL (或 MSVCRTD。DLL 和 MSVCP60D。DLL 的调试版本)。对于 Microsoft Visual C++ 5.0,程序将取决于 MSVCRT。DLL 和 MSVCP50。DLL (或 MSVCRTD。DLL 和 MSVCP50D。DLL 的调试版本)。对于 Microsoft Visual C++ 4.2,程序将取决于 MSVCRT。DLL (或 MSVCRTD。DLL 的调试版本) 和 MSVCPRT。LIB (或 MSVCPRTD。LIB,为调试版本)。

案例 3: 示例程序 test3.cpp

注意:扩展名为.h 流头文件 (包含 < useoldio.h >) Visual C++ 2002年中已弃用,Visual C++ 2005年和 Visual C++ 2003年中已被删除。因此,下面的示例将不晚于 Visual C++ 2002 Visual C++ 版中的新工作。
// test3.cpp#include <iostream.h>void main(){}
  • 如果生成使用/ML (或/MLd,调试版本) 的 test3.cpp 编译器选项,则程序将链接与 LIBC。LIB (或 LIBCD。为调试版本的 LIB) 和 LIBCI。LIB (或 LIBCID。LIB,为调试生成),另外向其他库。
    注意:在 Visual C++ 2005年及更高版本的 Visual C++ 删除/ML/MLd库对静态单线程库的编译器选项。
  • 如果生成使用/MT (或/MTd,调试版本) 的 test3.cpp 编译器选项,则程序将 LIBCMT 与链接。LIB (或 LIBCMTD。为调试版本的 LIB) 和 LIBCIMT。LIB (或 LIBCIMTD。LIB,为调试生成),另外向其他库。
  • 如果生成使用/MD (或/MDd,调试版本) 的 test3.cpp 编译器选项,则程序将链接与 MSVCRT。LIB (或 MSVCRTD。为调试版本的 LIB) 和 MSVCIRT。LIB (或 MSVCIRTD。LIB,为调试版本) 另外向其他库。在这种情况下,您的程序将取决于 MSVCRT。DLL (或 MSVCRTD。DLL 的调试版本) 和 MSVCIRT。DLL (或 MSVCIRTD。DLL 的调试版本)。
标头确定是否将链接的标准 c + + 库、 旧 iostream 库,还是两者皆否。编译器选项 (/ML [d]/MT [d][d] /MD) 确定哪个版本的库,单线程、 多线程或多线程的 DLL 是默认链接。注意:这可能看起来无扩展名为.h 头是标准 c + + 头和扩展名为.h 头是 C 运行时头或旧 iostream 头。这不是真实的。如下文所述,这些文件 < useoldio.h > 和 < use_ansi.h > 确定您的应用程序将链接的库。 实际上,有两个头文件,< useoldio.h > 和 < use_ansi.h > 包含 #pragmas。#Pragmas 强制旧 iostream 库或标准 c + + 库以进行链接,默认情况下。 头文件 < useoldio.h > 包含 #pragma 语句,强制旧 iostream 库以进行链接。所有旧 iostream 标头包含 < useoldio.h >。因此,如果您的应用程序中包括任何旧 iostream 头,旧 iostream 库将默认链接。下表列出了包含 < useoldio.h > 中的所有头文件。

旧 iostream 标题

FSTREAM.HIOMANIP.H
IOS.HIOSTREAM.H
ISTREAM.HOSTREAM.H
STDIOSTR.HSTREAMB.H
STRSTREA.H
注意< useoldio.h > 只适用于 Visual C++.NET 2003年和早期版本。因为旧 iostream 库已被删除从 Visual C++ 2003年及更高版本,< useoldio.h > 头也已被删除。
头文件 < use_ansi.h > 包含 #pragma 语句强制标准 c + + 库以进行链接。所有标准 c + + 的标题包含 < use_ansi.h >。因此如果您的应用程序中包括任何标准 c + + 头,标准 c + + 库将默认链接。下表列出了包含 < use_ansi.h > 中的所有头文件。

标准 c + + 头

算法BITSET复杂DEQUE
FSTREAM功能IOMANIPIOS
IOSFWDIOSTREAMISTREAM迭代器
限制列表区域设置地图
内存数字OSTREAM队列
SETSSTREAM堆栈STDEXCEPT
STREAMBUF字符串STRSTREAM类型信息
实用程序VALARRAY向量XIOSBASE
XLOCALEXLOCINFOXLOCMONXLOCNUM
XLOCTIMEXMEMORYXSTRINGXTREE
XUTILITYYMATH.H
您不能混合使用对旧 iostream 库和 Visual C++ 4.2 中新的标准 c + + 库的调用。
编译选项与链接的库
/ML (2003年和早期 VC + +.NET)LIBC.LIB, LIBCP.LIB
/ MLd (2003 和早期 VC + +.NET)LIBCD.LIB, LIBCPD.LIB
/MTLIBCMT.LIB, LIBCPMT.LIB
/MTdLIBCMTD.LIB, LIBCPMTD.LIB
/MDMSVCRT.LIB, MSVCPRT.LIB
/MDdMSVCRTD.LIB, MSVCPRTD.LIB

CRT Dll 使用的摘要表

与导入库链接使用 Dll (Visual C++ 5.0 | 6.0)使用 Dll (Visual C++.NET 2002年 |Visual C++.NET 2003年)使用 Dll (Visual C++ 2005年 |Visual C++ 2008 年
MSVCRT.LIBMSVCRT.DLLMSVCR7(0|1).DLLMSVCR(80|90).DLL
MSVCRTD.LIBMSVCRTD.DLLMSVCR7(0|1)D.DLLMSVCR(80|90)D.DLL
MSVCPRT.LIBMSVCP(5|6)0.DLLMSVCP7(0|1).DLLMSVCP(80|90).DLL
MSVCPRTD.LIBMSVCP(5|6)0D.DLLMSVCP7(0|1)D.DLLMSVCP(80|90)D.DLL
MSVCIRT.LIBMSVCIRT.DLL
MSVCIRTD.LIBMSVCIRTD.DLL

参考


C 运行时库http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
154419标准 c + + 库常见问题解答