VS系列 QT5開發遇到的部分問題以及解決方案

2021-08-02 13:51:56 字數 3449 閱讀 1214

1.錯誤: c1083

fatal error c1083: 無法開啟預編譯標頭檔案:「debug\***.pch」: no such file or directory

「rebuild all」沒有解決,然後把「c/c++」屬性中的「預編譯頭」由「使用(/yu)」改為「建立(/yc)」,問題解決了。看來還是預編譯標頭檔案***.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的

預編譯標頭檔案儲存的正是這部分資訊。以避免每次都要重新處理這些標頭檔案。此錯誤解決**

因為專案建立時候,沒有新增預編譯頭stdafx.h檔案,所有後面新增的時候,需要如上設定

2.  vs和qt5打包的程式到其他機器不能執行

解決: 1.把所有程式所需要的qt的dll庫全拷貝到debug目錄下

2.vs所需要的msvcr100.dll之類的windows的在system32或syswow64目錄下的dll庫拷貝進去

3.最關鍵的:出現如下錯誤:

然後將你qt安裝路徑下的  如下圖的兩個資料夾imageformats和platform,拷到debug目錄下,就可以到其他的機器上跑了。win7和win10的區別在於

msvcr100.dll ,msvcp100.dll和msvcr100d.dll,msvcp100d.dll的區別

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

golang GUI開發 Qt5的安裝

golang一直被認為沒有好的gui庫,事實並非如此。目前有基於gtk 3.0的gotk3 以及接下來我們要說的qt 這是基於最新的qt5 5.11 的非官方的binding。選用qt的理由 選擇therecipe qt的理由是首先因為它提供的api與原生qt以及其他binding 例如pyqt5 ...

Qt5開發 的QEvent事件類

事件種類 qtimerevent 定時器事件 qmouseevent 滑鼠事件 qwheelevent 滑動滑鼠滑輪事件 qtabletevent qkeyevent 鍵盤事件 qfocusevent 焦點事件 qpaintevent 繪畫事件 qmoveevent 移動事件 qresizeeven...

Qt5開發自定義控制項中遇到的問題

由於qt可以開發自定義控制項,能夠設計出更漂亮的ui,所以打算學習開發自己的控制項,但學習過程中遇到很多問題,經歷了各種挫折終於了解了定義控制項的開發過程。我的開發環境 qt msvc2015 5.7.1 qt msvc 32 位,qt creator 也是msvc 32 位的 一 新建qt4設計師...