调试记录-关于#include与#include在64位编译时的问题

因为调试了一晚上,所以在这里记录一下

vs2008中当使用 /MD编译,连接时会提示msvcirt.dll是X86的,和目标x64冲突

仔细看下,连接的是vc目录下的msvcirt.dll,一开始以为是路径问题,删掉VC6的路径后提示

找不到msvcirt.dll

一下转载自 http://ilbv.blog.163.com/blog/static/24059124200822884829619/

示例程序 test1.cpp 案例 1:

// test1.cpp
void main()
{
}
如果生成使用 / ML test1.cpp (或 ) 编译器选项, 程序将链接到其他库中除与 LIBC.LIB (或 LIBCD.LIB, 有关调试版本), MLd , 为调试生成 /。
如果生成使用 / MT test1.cpp (或 ) 编译器选项, 程序将链接到其他库中除与 LIBCMT.LIB (或 LIBCMTD.LIB, 有关调试版本), MTd , 为调试生成 /。
如果生成 test1.cpp 使用 / MD (或 ) 编译器选项, 程序将链接到其他库中除与 MSVCRT.LIB (或 MSVCRTD.LIB, 有关调试版本), MDd , 为调试生成 /。 在这种情况下, 程序将是依赖 MSVCRT.DLL (或 MSVCRTD.DLL 有关调试版本)。

例二: 示例程序 test2.cpp

   // test2.cpp
#include <iostream>
void main()
{
}
如果生成使用 / ML test2.cpp LIBCP.LIB (或 LIBCPD.LIB, 有关调试版本), 和其他库或 ) 编译器选项, 将程序链接与 LIBC.LIB (或 LIBCD.LIB, 有关调试版本) MLd , 为调试生成 (/。
如果生成使用 / MT test2.cpp LIBCPMT.LIB (或 LIBCPMTD.LIB, 有关调试版本), 和其他库或 ) 编译器选项, 将程序链接与 LIBCMT.LIB (或 LIBCMTD.LIB, 有关调试版本) MTd , 为调试生成 (/。
如果生成使用 test2.cpp MSVCPRT.LIB (或 MSVCPRTD.LIB, 有关调试版本), 和其他库 (or /MDd, for a debug build) 编译器选项, / MD 与 MSVCRT.LIB (或 MSVCRTD.LIB, 有关调试版本) 将程序链接。 
对于 Microsoft Visual C++ 2005, 程序将会依赖 MSVCRT.DLL 和 MSVCP80.DLL (或 MSVCRTD.DLL 和 MSVCP80D.DLL 有关调试版本)。 
对于 Microsoft Visual C++ 2003, 程序将会依赖 MSVCRT.DLL 和 MSVCP71.DLL (或 MSVCRTD.DLL 和 MSVCP71D.DLL 有关调试版本)。 
对于 Microsoft Visual C++ 2002, 程序将会依赖 MSVCRT.DLL 和 MSVCP70.DLL (或 MSVCRTD.DLL 和 MSVCP70D.DLL 有关调试版本)。 
对于 MicrosoftVisualC++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, 有关调试版本)。

示例程序 test3.cpp 情况 3:

具有 h 扩展名 注意 : 流头文件有 Visual C++ 2002年抨击并在 VisualC++2005 和 Visual C++ 2003 中删除了 (包括 < useoldio.h >)。 因此, 以下示例在晚于 Visual C++ 2002 版本的 VisualC++ 中无法工作。
// test3.cpp
#include <iostream.h>
void main()
{
}
如果生成使用 / ML test3.cpp LIBCI.LIB (或 LIBCID.LIB, 有关调试版本), 和其他库或 ) 编译器选项, 将程序链接与 LIBC.LIB (或 LIBCD.LIB, 有关调试版本) MLd , 为调试生成 (/。
如果生成使用 / MT test3.cpp LIBCIMT.LIB (或 LIBCIMTD.LIB, 有关调试版本), 和其他库或 ) 编译器选项, 将程序链接与 LIBCMT.LIB (或 LIBCMTD.LIB, 有关调试版本) MTd , 为调试生成 (/。
如果生成使用 / MD test3.cpp MSVCIRT.LIB (或 MSVCIRTD.LIB, 有关调试版本) 和其他库或 ) 编译器选项, 将程序链接与 MSVCRT.LIB (或 MSVCRTD.LIB, 有关调试版本) MDd , 为调试生成 (/。 这种情况下, 程序将会依赖 MSVCRT.DLL (或为调试生成 MSVCRTD.DLL) MSVCIRT.DLL (或 MSVCIRTD.DLL 有关调试版本)。
确定是否将链接标准 C++ 库、 旧 iostream 库, 或没有标题。 确定是否为默认链接多线程 DLL 版本的单线程、 多线程, 库或编译器选项 ( / ML [ d ] , [ d ] / MT , / MD [ d ] )。 

注意 它似乎头没有 h 扩展名是常用 C++ 头并且页眉与 h 扩展名是 C 运行头或旧 iostream 头。 不是如此。 详见下面, < useoldio.h > 文件和 < use_ansi.h > 确定库应用程序将链接。 

实际, 还有两头文件, 包含 #pragmas 和 <use_ansi.h>, <useoldio.h>。 #pragmas 强制或者旧 iostream 库或标准 C++ 库到中链接默认。 

头文件 <useoldio.h> 包含 # pragma 语句, 强制被链接到旧 iostream 库。 所有旧 iostream 头包括 <useoldio.h>。 因此, 如果, 应用程序中包含任何旧 iostream 头旧 iostream 库将链接默认。 下表列出所有头文件包含 <useoldio.h>。
   Old iostream Headers
--------------------

FSTREAM.H IOMANIP.H
IOS.H IOSTREAM.H
ISTREAM.H OSTREAM.H
STDIOSTR.H STREAMB.H
STRSTREA.H
头文件 <use_ansi.h> 包含 # pragma 语句, 强制常用 C++ 库中被链接到。 所有常用 C++ 头包括 <use_ansi.h>。 因此如果, 应用程序中包含任何常用 C++ 头标准 C++ 库将链接默认。 下表列出所有头文件包含 <use_ansi.h>。
   Standard C++ Headers
------------------------------------------------------

ALGORITHM BITSET COMPLEX DEQUE
FSTREAM FUNCTIONAL IOMANIP IOS
IOSFWD IOSTREAM ISTREAM ITERATOR
LIMITS LIST LOCALE MAP
MEMORY NUMERIC OSTREAM QUEUE
SET SSTREAM STACK STDEXCEPT
STREAMBUF STRING STRSTREAM TYPEINFO
UTILITY VALARRAY VECTOR XIOSBASE
XLOCALE XLOCINFO XLOCMON XLOCNUM
XLOCTIME XMEMORY XSTRING XTREE
XUTILITY YMATH.H
不能混合对旧 iostream 库和新标准 C++ 库 Visual C++ 4.2 中调用。
                      Summary Table

------------------------------------------------------------------
| Compile Old New IOStream Libraries |
| Option IOStream or STL Linked With |
|================================================================|
| /ML No No LIBC.LIB |
|----------------------------------------------------------------|
| /MLd No No LIBCD.LIB |
|----------------------------------------------------------------|
| /MT No No LIBCMT.LIB |
|----------------------------------------------------------------|
| /MTd No No LIBCMTD.LIB |
|----------------------------------------------------------------|
| /MD No No MSVCRT.LIB |
|----------------------------------------------------------------|
| /MDd No No MSVCRTD.LIB |
|----------------------------------------------------------------|
| /ML No Yes LIBC.LIB, LIBCP.LIB |
|----------------------------------------------------------------|
| /MLd No Yes LIBCD.LIB, LIBCPD.LIB |
|----------------------------------------------------------------|
| /MT No Yes LIBCMT.LIB, LIBCPMT.LIB |
|----------------------------------------------------------------|
| /MTd No Yes LIBCMTD.LIB, LIBCPMTD.LIB |
|----------------------------------------------------------------|
| /MD No Yes MSVCRT.LIB, MSVCPRT.LIB |
|----------------------------------------------------------------|
| /MDd No Yes MSVCRTD.LIB, MSVCPRTD.LIB |
|----------------------------------------------------------------|
| /ML Yes No LIBC.LIB, LIBCI.LIB |
|----------------------------------------------------------------|
| /MLd Yes No LIBCD.LIB, LIBCID.LIB |
|----------------------------------------------------------------|
| /MT Yes No LIBCMT.LIB, LIBCIMT.LIB |
|----------------------------------------------------------------|
| /MTd Yes No LIBCMTD.LIB, LIBCIMTD.LIB |
|----------------------------------------------------------------|
| /MD Yes No MSVCRT.LIB, MSVCIRT.LIB |
|----------------------------------------------------------------|
| /MDd Yes No MSVCRTD.LIB, MSVCIRTD.LIB |
------------------------------------------------------------------


对于使用 CRT DLL 摘要表
与导入库链接使用 DLL (VisualC++ 5.0|6.0)DLL 使用 (Visual C++ 4.2)DLL 使用 (VisualC++.NET 2002| Visual C++ .NET 2003)
MSVCRT.LIBMSVCRT.DLLMSVCRT.DLLMSVCRT.DLL
MSVCRTD.LIBMSVCRTD.DLLMSVCRTD.DLLMSVCRTD.DLL
MSVCPRT.LIB(5|6) MSVCP 0.DLL
MSVCP7 (0 | 1 .DLL)
MSVCPRTD.LIB(5|6) MSVCP 0D.DLL
MSVCP7 D.DLL (0 | 1)
MSVCIRT.LIBMSVCIRT.DLLMSVCIRT.DLL
MSVCIRTD.LIBMSVCIRTD.DLLMSVCIRTD.DLL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值