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.最關鍵的:出現如下錯誤:


         


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

 然後將你QT安裝路徑下的  如下圖的兩個文件夾imageformats和platform,拷到debug目錄下,就可以到其他的機器上跑了。win7和win10的區別在於msvcr100.dll ,msvcp100.dll和msvcr100d.dll,msvcp100d.dll的區別



     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”。

發佈了68 篇原創文章 · 獲贊 216 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章