VS系列+QT5开发遇到的部分问题以及解决方案

 VS2010+QT5开发所踩过的坑


        最近因为项目需要,vs中写QT,各种踩坑,就想把最后解决的,各种错误和对应的解决方法分享出来,有些是百度别人的,这里把自己成功解决的问题和方案贴出来。


     1.错误: C1083


          fatal error C1083: 无法打开预编译头文件:“Debug\xxx.pch”: No such file or directory

“Rebuild All”没有解决,然后把“C/C++”属性中的“预编译头”由“使用(/Yu)”改为“创建(/Yc)”,问题解决了。看来还是预编译头文件xxx.pch创建的有问题,仔细想一下,vc工程的预编译头是由stdafx.cpp编译生成的。(其实起作用的是stdafx.h,但头文件不参加编译,所以需要stdafx.cpp文件,这个文件里只有一句代码:#include “Stdafx.h”。)


     综上:最妥善的解决方法就是,在工程属性中,选择“使用(/Yu)”预编译头,而单独将stdafx.cpp设置为“创建(/Yc)”预编译头。

     关于“预编译头”的作用,参考如下:

在很多程序中,每个源文件都存在一些相同的部分。比如要包含相同的一些头文件,而且这些头文件可能很长,例如window.h。如果用普通的方法编译这些源文件,对这些头文件在每个源文件中的出现都要重新编译,作了很多重复工作。如果能将这些头文件专门进行编译,并且把结果存储起来。然后在编译包含这些头文件的源文件时,使用上述结果替代头文件在源文件中的出现,就可以大大减少工作量。Microsoft Visual C++提供的“预编译头文件”机制就支持这一功能。

所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常以.pch为扩展名),这个文件就称为预编译头文件。这些预先编译好的代码可以是任何的C/C++代码——–甚至是inline的函数,但必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。

也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。此错误解决转自http://www.zhuyanfeng.com/archives/2231



因为项目创建时候,没有添加预编译头stdafx.h文件,所有后面添加的时候,需要如上设置


     2.  VS和QT5打包的程序到其他机器不能运行


  解决: 1.把所有程序所需要的QT的dll库全拷贝到debug目录下


             2.VS所需要的msvcr100.dll之类的Windows的在system32或syswow64目录下的dll库拷贝进去


             3.最关键的:出现如下错误:


         VS系列+QT5开发遇到的部分问题以及解决方案


  解决如下:main.cpp中写一行 QApplication::addLibraryPath("./plugins");

 然后将你QT安装路径下的  如下图的两个文件夹imageformats和platform,拷到debug目录下,就可以到其他的机器上跑了。win7和win10的区别在于msvcr100.dll ,msvcp100.dll和msvcr100d.dll,msvcp100d.dll的区别

VS系列+QT5开发遇到的部分问题以及解决方案


     3.      error C2011: “s_buffer”:“struct”类型重定义 

解决:h文件头加#pragma once




4.在更新VS2010,或者卸载VS2012安装2010后,或者安装VS2010的插件之后,建立Win32 Console 


Project/MFC/QT原本可以编译成功的项目时会出现"LINK : fatal error LNK1123: 转换到 COFF 期间失败: 


文件无效或损坏"的错误。


错误描述:
1>正在编译资源...
1>正在编译资源清单...
1>正在链接...
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
1>生成日志保存在“file://E:\HelloC\ShapeFill V11\ShapeFill\Debug\ShapeFill.log”
1>ShapeFill- 1个错误,0个警告
========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过 ==========


解决方案:
 第一步:将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”。


若还不能解决问题进入第二步。
第二步:查看计算机是否为64bit操作系统,如是,继续如下操作。
查找是否有两个cvtres.exe。
C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe (删除这个就可以编译运行了)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
右键属性—详细信息, 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。
 
治本的办法是第二步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。



      5.   error C4996: 'mkdir': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _mkdir. See online help for details. 

  这是在vs2015中使用mkdir函数报错的。 一般用scanf  或者 sprintf 之类的函数, 会报安全问题,加个   _CRT_SECURE_NO_DEPRECATE  宏就可以了,但这种问题在VS 2012之前的版本中是不会当做错误的,只是提出一个警告。为了避免报错,可以使用以下两个宏定义来屏蔽掉这种    错误。
在common.cpp文件的属性->c/c++->预处理器->预处理器定义   中添加如下两个宏定义:
    _CRT_SECURE_NO_DEPRECATE 
    _CRT_NONSTDC_NO_DEPRECATE 
  
   6.编译效率问题:   添加自定义的stdafx.h头文件的时候,如果都使用Yc编译会很慢,这里使用:于是把原工程的属性改为使用预编译头(/Yu),仅仅把stdafx.cpp改为创建预编译头(/Yc)。

  7.VS2010中自己编程时遇到这个问题:

_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)

解决办法:

在stdafx.h中添加宏定义:“#define _WIN32_WINNT 0x0502”。