[Quote=引用 14 楼 akirya 的回复:]
mfc没啥问题吧,我直接用VC5的mfc头文件,链接对应的mfc42直接就过去了。
[/Quote]
:O!!!!
看到坏编译通过,我重新有了解决它的信心,再去试!
今天发现了一个很好的链接的命令行, /verbose,可以显示查找符号时候的详细过程。
在一通折腾之后终于成功的解决了这个问题,兴奋之余,上来结贴:
工程的include的目录设置为
D:\xpoy\tools\编译器\IDE\vc6\VC98\Include;
D:\xpoy\tools\编译器\IDE\vc6\VC98\MFC\Include;
D:\xpoy\tools\编译器\IDE\vc6\VC98\ATL\Include;
那个什么#using的LIBPATH的设置为
D:\xpoy\tools\编译器\IDE\vc6\VC98\Lib;
D:\xpoy\tools\编译器\IDE\vc6\VC98\MFC\Lib;
排除目录为
D:\xpoy\tools\编译器\IDE\vc6\VC98\Lib;
D:\xpoy\tools\编译器\IDE\vc6\VC98\MFC\Lib;
src目录为
D:\xpoy\tools\编译器\IDE\vc6\VC98\CRT\SRC;
D:\xpoy\tools\编译器\IDE\vc6\VC98\MFC\SRC;
工程的其他需要设置的地方包括,
工程选项->C/C++ ->代码生成->启用c++异常== 否
较小类型时检查== 否
基本运行时检查== 默认值 (也就是无)
工程选项->C/C++ ->语言->将wchar_t视为内置类型== 否
注意如果没有特别需要的话,不要在这种情况下禁用掉默认链接的那些库,不然你需要手工根据vs编译时查找的库配置好。可以参考最后面的一些信息来这样做。
工程配置好之后,我们的工程就是可以依赖vc6的库而不是vs2010的了!
下面详细说明下其他需要注意的地方,也附上了大量以前的学习做的笔记,总结的信息是自己写的,可能有疏忽的地方,注意下!
有了/verbose选项得到详细的链接时使用的符号和符号所在库的信息。发现了三种特殊的编译器自动在生成对应功能时使用的符号,也就是说,这三种功能,在这样编译时候是不能使用的。
VC8 (or VS2005)及其以后的编译器,会自动在生成对应功能时使用的符号,也就是说,这三种功能,在强行使用旧版本的VC支持库时候是不能正常工作的。
当然,对我们而言就是不能使用下面三种功能。主要是msvcrt.lib和MFC的nafxcw.lib中的区别。
1. debug版本的话,通常会碰到__RTC_CheckEsp符号的问题,它可以通过去掉掉 Basic Runtime Check 基本运行时检查(/RTC)来禁用掉,以及关闭掉堆栈安全cookie检查 Buffer Security Checks (/GS-),这个选项是编译的选项,影响的直接是c++生成的代码中不使用这些功能,于是编译器不会添加对这些固定名称的函数的调用了。
2. __try/__except/ __leave的VC编译器支持的windows下特有的SEH方式异常处理方式。当使用它时,至少vs2010的编译器会默认添加对符号 __SEH_epilog和__SEH_prolog的使用,这是为过度到x64的PE程序而设计的功能(实现异常时回滚函数的执行的功能)。
3. try/ catch/ finally的c++异常处理方式,VS2010会自动使用__CxxFrameHandler3作为一个总的异常分发起点,在里面把try/ catch/ finally中的代码当做回调函数的形式来调用。但__CxxFrameHandler3只存在于VS2010对应版本的支持库中,之前的版本中也是不存在的。
当生成release (或debug) 版本的项目时,在 Visual c + +会默认链接的是从LIBC [D].lib、 LIBCMT [D].lib 和 MSVCRT[D].LIB)中选择的一个基本的 C 运行时库,具体链接的一个取决于您选择编译器选项 (单线程
这儿有一个误区,大部分人会以为vc链接时使用的是它的运行时库msvcrt.lib,但msvcrt.lib中实际只是保持了msvcrt.dll的导出表的信息。而使用一个特别的库,用这个特别库再把msvcrt.lib链接进来,是有实际意义的。为的是解决c/ c++运行时的初始化的问题,vc通过协定一些特殊的符号,让c/c++版本的编译器能利用这些特殊符号名称和连接器使用的库文件(如libcmt)互相配合起来,实现c/ c++中的各种(功能和)初始化。
需要ANSI字符和字符串的GUI应用程序 WinMainCRTStartup
需要Unicode字符和字符串的GUI应用程序 wWinMainCRTStartup
需要ANSI字符和字符串的CUI应用程序 mainmainCRTStartup
需要Unicode字符和字符串的CUI应用程序 wmainwmainCRTStartup
C运行时库所连接的lib和编译时的设置对应关系(without iostream or standard C++ library):
C run-time library Characteristics Option 预处理产生的宏
LIBC.LIB Single-threaded, static link /ML
LIBCMT.LIB Multithreaded, static link /MT _MT
MSVCRT.LIB Multithreaded, dynamic link (MSVCR71.DLL). /MD _MT, _DLL
注意,如果你使用了标准c++的库,你的程序就需要MSVCP71才能运行了。
LIBCD.LIB Single-threaded, static link (debug) /MLd _DEBUG
LIBCMTD.LIB Multithreaded, static link (debug) /MTd _DEBUG, _MT
MSVCRTD.LIB Multithreaded, dynamic link (MSVCR71D.DLL) (debug) /MDd _DEBUG
当生成release (或debug) 版本的项目时,在 Visual c + +会默认链接的是从LIBC [D].lib、 LIBCMT [D].lib 和 MSVCRT[D].LIB)中选择的一个基本的 C 运行时库,具体链接的一个取决于您选择编译器选项 (单线程
C run-time library Characteristics Option 预处理产生的宏
LIBC.LIB Single-threaded, static link /ML
LIBCMT.LIB Multithreaded, static link /MT _MT
MSVCRT.LIB Multithreaded, dynamic link (MSVCR71.DLL). /MD _MT, _DLL
注意,如果你使用了标准c++的库,你的程序就需要MSVCP71才能运行了。
LIBCD.LIB Single-threaded, static link (debug) /MLd _DEBUG
LIBCMTD.LIB Multithreaded, static link (debug) /MTd _DEBUG, _MT
MSVCRTD.LIB Multithreaded, dynamic link (MSVCR71D.DLL) (debug) /MDd _DEBUG
c++运行时库所链接的lib和编译时的设置对应关系:
Standard C++ Library Characteristics Option 预处理产生的宏
LIBCP.LIB Single-threaded, static link /ML
LIBCPMT.LIB Multithreaded, static link /MT _MT
MSVCPRT.LIB Multithreaded, dynamic link (MSVCP71.dll) /MD _MT, _DLL
LIBCPD.LIB Single-threaded, static link /MLd _DEBUG
LIBCPMTD.LIB Multithreaded, static link /MTd _DEBUG, _MT
MSVCPRTD.LIB Multithreaded, dynamic link (MSVCP71D.DLL) /MDd _DEBUG, _MT,
这儿有一个误区,大部分人会以为vc链接时使用的是它的运行时库msvcrt.lib,但msvcrt.lib中实际只是保存了和当前VC的版本所对应的msvcrt.dll(或者msvcr100.dll)的导出表的信息,因而链接msvcrt.lib会自动选择对应的DLL。而使用一个特别的库,用这个特别库再把msvcrt.lib链接进来,是有实际意义的。为的是解决c/c++运行时的初始化的问题,vc通过协定一些特殊的符号,让c/c++版本的编译器能利用这些特殊符号名称和连接器使用的库文件(如libcmt)互相配合起来,实现c/ c++中的各种(功能和)初始化。这些编译器使用的特殊符号其含义其应用范围如下,
vc的lib常见的subsystem下使用的实际PE入口点分别是:
需要ANSI字符和字符串的GUI应用程序 WinMainCRTStartup
需要Unicode字符和字符串的GUI应用程序 wWinMainCRTStartup
需要ANSI字符和字符串的CUI应用程序 mainmainCRTStartup
需要Unicode字符和字符串的CUI应用程序 wmainwmainCRTStartup
下面的是静态链接MFC时使用的库文件,
库文件 对应的字符集版本 debug版本或者release版本的库
NAFXCW.LIB ASCII release
UAFXCW.LIB UNICODE release
NAFXCWD.LIB ASCII debug
UAFXCWD.LIB UNICODE debug
下面的是动态链接MFC时使用的库文件,
库文件 对应的字符集版本 debug版本或者release版本的库
mfc42.lib+ mfcs42.lib ASCII release
MFC42D.LIB+ MFCS42D.LIB ASCII debug
mfc42u.lib+ mfcs42u.lib UNICODE release
MFC42UD.LIB+ MFCS42UD.LIB UNICODE debug
另有几个lib,储存的是MFC中一些不常用功能的lib,命名格式是一样的,结尾的D表示debug版本。U则是UNICODE版本
好看点的那个表