项目从VC6 -> VS2008 常见问题

来源:互联网 发布:windows repair 编辑:程序博客网 时间:2024/05/29 19:55
* 警告 “初始化”: 截断常量值”
eg: char c=176;
原因:
数字默认是int型的,int的表示范围比char大,所以警告说,从int到char可能会截断




* warning C4996 “strcat”被声明为否决的
VC6转为vs2008之后,有1000+这样的警告:
1>D:\ACE_wrappers\ace/OS_NS_string.inl(110) : warning C4996: “strcat”被声明为否决的
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(78) : 参见“strcat”的声明
1>        消息:“This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.”
 
警告是无害的。这个警告是暗示涉及的函数可能会出现缓冲溢出。2008的编译器比之前的都更加严格,针对缓冲溢出,做了不少改进,2008中的一些函数,如 sprintf都建议使用 sprintf_s一类的来进行缓冲区溢出的保护.
其实解决方法就是:添加欲编译宏:,_CRT_SECURE_NO_DEPRECATE
 
添加预编译宏:在工程属性里,C++->预处理器->预处理器定义设置
 
 
* 多个头文件对boolean变量重复定义问题怎么解决?
错误现象:
在occi的oratypes.h中有对boolean的宏定义,
#ifndef boolean
#ifndef lint
typedef int boolean;
#else
#define boolean int
#endif
#endif
与rpcndr.h中的 typedef unsigned char boolean 有冲突;


解决方法:
网上说的更改.h文件包含位置,把对occi.h的引用放在了windows.h引用的后面
我的已经是这样了,之后发现重定义的两个都是typedef,因此,对oratypes.h做如下修改:
#ifndef boolean
#ifndef lint
//typedef int boolean;
#define boolean int
#else
#define boolean int
#endif
#endif
 
 
* error C2601: “CcameratestDlg::OnDestroy” : 本地函数定义是非法的
解决方法:仔细检查大括号等起始/结束标志是否匹配
 
我的问题是:
vc6:(有些多余的东西,本身也没用,影响了格式)
  BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  //{{AFX_MSG_MAP(CMainFrame)
  ON_WM_CREATE()
  ON_WM_TIMER()
  ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
  //}}AFX_MSG_MAP
    ID_***
    ID_****
  END_MESSAGE_MAP()
解决方法:删除多余的代码
  BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
  //{{AFX_MSG_MAP(CMainFrame)
  ON_WM_CREATE()
  ON_WM_TIMER()
  ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
  //}}AFX_MSG_MAP
  END_MESSAGE_MAP()
 
 
* error C2440: “static_cast”: 无法从“UINT (__thiscall CTestDlg::* )(CPoint)”转换为
 
从vc6转移到vs2005   发生下面问题:  
  BEGIN_MESSAGE_MAP(CTestDlg,   CCaptionBtnDlg)  
          ON_WM_NCHITTEST()       //vs2005   检测错误在这里  
  END_MESSAGE_MAP()  
   
  afx_msg   UINT   OnNcHitTest(CPoint   point);
  UINT   CTestDlg::OnNcHitTest(CPoint   point)    
  {  
  ....  
  }  
 
解决方法:
  afx_msg   UINT   OnNcHitTest(CPoint   point);
  UINT   CTestDlg::OnNcHitTest(CPoint   point)
=>
  afx_msg   LRESULT   OnNcHitTest(CPoint   point);
  LRESULT   CTestDlg::OnNcHitTest(CPoint   point)
 
 
* 致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。
当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。
错误原因:该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 常常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来说,使用预编译头可以使总的编译时间大大减少。因而保留预编译头的设置才是比较好的解决方案。搜索 MSDN,针对不同的情况,可以有不同的解决方案:
解决方案:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的情况。在这种情况下,将少数的不同类文件设为不使用预编译头是比较平衡的做法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;(对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled headers 项下设置 not using... 即可。如果需要设置多个文件,则可以按住 Ctrl 键再同时选中这些文件并设置)PS:解释如下点击项目 点击属性 然后选择C/C++   预编译头 创建使用头文件 不使用预编译头文件
 
 
* 应用程序无法启动,因为应用程序的并行配置不正确
我的解决方法(release版本):
步骤一:项目属性-常规-MFC的使用 :在静态库中使用MFC
步骤二:项目属性-C/C++ -代码生成-运行时库:多线程/MT (debug版本是不是应该是/MTd呢?)
 
网上说的另一中方法(我没试):
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest
把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。
其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!
 
 
* 项目配置为“在静态库中使用MFC”,编译错误error RC2151
编译错误error RC2151 : cannot reuse string constants, 61446(0xF006)
我写程序很少发布过,都是写完了给领导同事,他把我的代码拷到他的工程上,去发布。最近发布个,编译的时候竟然出现了这样的错误
error RC2151 : cannot reuse string constants, 61446(0xF006) - "(##########,##########)" already defined. Cannot add 61446(0xF006) - "一未命名文件".
搜索了下,原来是是在发布的时候,使用Release版本,Static library编译时,MFC中afxres.h中61446已竟被使用,出现同一ID被两次使用。
所以,将自己写的那段资源ID改成比61446大些问题就解决了。
 
 
* nafxcwd.lib(afxmem.obj) : error LNK2005
(1)错误案例:在写日志程序中出现,工程是MFC程序(注:win32控制台应用程序,不会出现这种错误,当然是不支持MFC库的那种)
(2)错误原因:如下能看出一点眉目,重定义了.在使用***.obj时,已经在***.lib库中定义了.
摘抄:
上网搜了下,是CRT库与MFC库的冲突,解决方法是:让程序先链接Nafxcwd.lib,然后再链接Libcmtd.lib
you've got to change the order inwhich the libraries are linked. This is a bit tricky, since the library are linked automatically, without you explicitly specifying them.


So, first step, tell the linker to ignore the implicit libraries: Project/Setting/Linker, Input Tab, and put "Nafxcwd.lib Libcmtd.lib" in the "Libraries to Ignore" box.


Next, on the same page, in the Object/library Modules box, put the same to libraries. (in you still get the same error, try reversing them on this line)
可以从错误信息里看到,操作符new,delete,delete[]已经在LIBCMTD.lib中定义了,这跟C编译时使用的默认库与MFC运行时的默认编译库编译时链接顺序有关,我们可以手动的改变两个库的编译顺序就能解决这个定义冲突问题。
(3)错误现场:
1>正在链接...
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" () 已经在 LIBCMTD.lib(new.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" () 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" () 已经在 libcpmtd.lib(newaop.obj) 中定义
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" () 已经在 LIBCMTD.lib(delete2.obj) 中定义
1>C:\Documents and Settings\Administrator\桌面\多线程写日志怎样写\写日志1\Debug\写日志1.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
(4)错误解决办法:
中文
项目--属性 ---连接器---输入  
                              附加依赖项    空格Nafxcwd.lib Libcmtd.lib
                              忽略指定库    空格Nafxcwd.lib Libcmtd.lib
清除项目。重新编译。搞定
原创粉丝点击