VS_Qt 常見錯誤(持續更新)


VS+QT需要獲得.ui對應的ui_XXXX.h頭文件的解決方法

解決辦法:

(1)在 Qt5.11.2\5.11.2\mingw53_32\bin 目錄下有對應的 uic.exe 用來生成 .ui 對應的 ui_XXXX.h 頭文件,所以 cmd 進入 bin 目錄,運行uic XXXX.ui ui_XXXX.h就可以生成。

(2)在 VS 下,右鍵 .ui 文件 -> "編譯",就會生成對應的 ui_XXXX.h 頭文件,但默認的 ui_XXX.h 輸出目錄是$(IntDir)\uic\%(RelativeDir),在工程所在的 Debug\uic 目錄下,而實際需要修改在自定義的 GeneratedFiles 目錄下,右鍵 .ui 文件 -> "配置屬性" -> “uic”,修改輸出目錄為GeneratedFiles\


QT -1: error: [debug/qrc_images.cpp] 異常解決

運行報錯:

-1: error: [debug/qrc_images.cpp]

解決辦法:
右鍵 .qrc 文件,點擊 open in editor 后出現的紅色就是誤刪遺留下來的問題,刪掉重新編譯即可。


問題:
在用 VS2015 編譯網上別人的源碼時,出現了 LINK : fatal error LNK1158: 無法運行“rc.exe” 的問題。

解決方法:
打開 C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64 文件夾(找不到可以用 Everything 搜 "rc.exe"),復制里邊的 “rc.exe” 和 "rcdll.dll",拷貝到 VS2015 的 VC 下的 bin 目錄下,我的是 E:\technology\VS 2015\VC\bin,重新 build 即成功。
(這個問題應該是最近對 VS 進行過修改,或者環境變量變了,其實將這個路徑加到環境變量的 PATH 中去也是可以的)


undefined reference to `vtable for’”問題的原因及解決方法

原因:

Qt 中,類要支持信號與槽機制,需要繼承自 QObject 並在頭文件開頭添加 Q_OBJECT 宏。
如果使用 QtCreator 創建類時,沒有選擇繼承自 QObject 類或其子類,而在創建后手工修改繼承自 QObject 並手動添加 Q_OBJECT 宏,則在編譯時有可能會出現 ”undefined reference to `vtable for’…….” 錯誤.

**解決方法: **

把新創建的類從項目中移除(主要不要從磁盤上刪除),然后再添加進來,QtCreator就會重新解析此類,再編譯就不再會出現上述錯誤。


Qt Creator提示無法用“UTF-8”編碼解碼,無法編輯

問題:

在 Qt Creator 里打開其他編輯器的代碼時,有時會提示無法用 “UTF-8” 編碼解碼,無法編輯。

解決方法:

(1)找到源文件,在文件上右鍵使用 Notepad++ 編輯器打開,選擇 ---> “編碼” --->“轉為UTF-8編碼”

(2)windows環境下,Qt Creator,菜單 -> 工具 -> 選項 -> 文本編輯器 ->行為 -> 文件編碼:默認編碼:System(簡體中文Windows系統默認指的是GBK編碼,即下拉框選項里的GBK/windows-936-2000/CP936/windows-936)


error LNK2019: 無法解析的外部符號 __imp__recv@16,該符號在函數 _*** 中被引用

出現這個錯誤,一般都是缺少了相關的庫文件,可以右鍵點擊項目,選擇屬性,選擇鏈接器,選擇輸入,選擇附加依賴項,在依賴項里添加相應的庫文件,這里是 ws2_32.lib 文件,然后就可以了。


error: unknown type name 'class' 的解決方法

編譯工程時出現以下錯誤:

error: unknown type name 'class'

原因:

C 文件 include 了帶有 C++ 關鍵字的頭文件,如 class 等。因此,包含 C++ 關鍵字的頭文件被 C 編譯器所編譯,而不是用 C++ 編譯器編譯,而 C 編譯器無法識別 C++ 的關鍵字,所以報錯。

解決方法:

1、不能在 C 文件中包含 C++ 的頭文件,所以需要將 .c 改成 .cpp。

2、在所有使用 C++ 方法的地方加上:#ifdef __cplusplus,如:

#ifdef __cplusplus

class A{

};

#endi

注:如果使用了 extern "C" ,也要加上 #ifdef __cplusplus,因為 C 編譯器無法識別 extern "C"。


fatal error C1083: 無法打開包括文件:“unistd.h”: No such file or directory

許多在 Linux 下開發的 C 程序都需要頭文件 unistd.h,但 VC 中沒有個頭文件,所以用 VC 編譯總是報錯。把下面的內容保存為 unistd.h,可以解決這個問題。

#ifndef _UNISTD_H
#define _UNISTD_H

#include <io.h>
#include <process.h>

#endif /* _UNISTD_H */

fatal error LNK1281: 無法生成 SAFESEH 映像

解決方法:

1.打開該項目的“屬性頁”對話框。

2.單擊“鏈接器”文件夾。

3.單擊“命令行”屬性頁。

4.將 /SAFESEH:NO 鍵入“附加選項”框中,然后點擊應用。


找不到Qt5Cored.dll

Qt5Cored.dll 和 Qt5Core.dll 文件分別用於 Qt 軟件的 Debug 版和 Release 版。

通常會有兩個 Qt5Core.dll 文件,分別位於 Qt 安裝目錄下的 “Qt5.11.2\5.11.2\mingw48_32\bin” 和 “\Qt5.11.2\Tools\QtCreator\bin” 兩個目錄中。其中 “Qt5.11.2\5.11.2\mingw48_32\bin” 目錄下才是 Qt 項目運行時所需的庫。

但是,有時候在運行 Release 版項目時,卻提示沒有找到 Qt5Cored.dll。這是由於在編譯 Release 版時,錯誤的鏈接到了 Debug 版的庫上。這種情況主要發生在使用了第三方軟件庫的時候,在編譯第三方軟件庫時,Debug 版本庫鏈接到 Qt 的 Qt5Cored.dll,而 Release 版鏈接到 Qt5Core.dll,如果在編譯 Release 版項目時錯誤的鏈接了第三方軟件庫的 Debug 版,則也會間接的鏈接 Debug 版的相關支持庫(如 Qt5Cored.dll),因此在運行項目時提示需要相關的 Debug 版支持庫。

舉個例子:在編譯 Release 版項目時,工程文件中有 “#LIBS += D:/Qwt-6.1.0/lib/qwtd.dll”(這是 QWT 庫,QWT 庫需要 QT 庫的支持),則在運行時提示 “找不到Qt5Cored.dll文件”,這時將其修改為 “#LIBS += D:/Qwt-6.1.0/lib/qwt.dll” 則解決問題。


正確解決:坑爹的0xc000007b——應用程序無法正常啟動

(1)根本原因是缺乏所需要的 DLL,提供了錯誤版本的 dll 相當於沒有 DLL, 提示完全一樣。

(2)網上有人說缺乏 dx 運行環境,如果屬實,也是因為缺乏 dx 相關的 dll。

(3)與程序是 32 還是 64 位沒有直接關系,但是與你的程序對應不上的 dll 版本,往往很難發現問題,要引起注意。

(4)生成的 debug 目錄下,運行 exe 文件報改錯,將缺少的 dll 文件添加進來即可解決,例如 opencv_world411d.dll。


彈窗崩潰:abort() has been called 錯誤分析及其解決方法

調試代碼的過程中經常會遇到 abort() has been called 的錯誤,導致出現這樣的原因有:

(1)內存泄漏,導致內存不夠分配;

(2)非法指針訪問或者指針訪問內存越界出現問題;
(3)多線程訪問資源出的問題。

參考:R6010 -abort() has been called錯誤分析及其解決方法


This application failed to start because it could not find or load the Qt platform plugin “windows” 錯誤解決方法

用 inno setup 打包生成了一個安裝 exe,U 盤拷到另一台電腦安裝運行,出現該錯誤!

根據錯誤提示發現是和 platform 有關,是因為前面誤刪了安裝目錄下的 platforms 文件夾以及其內部的 qwindows.dll,把 plugins/platform 這個文件夾原封不動地復制到安裝包里再打包即可。


Qt中文亂碼問題

方法一:

ui->pushButton->setText(QString::fromLocal8Bit("我是中文"));

方法二:

將默認字體設置為 UTF8,再配合 tr("我是中文") 就不會亂碼啦。


解決Qt線程關閉問題!QThread: Destroyed while thread is still running

耗時操作里面這樣判斷:

 while (!isInterruptionRequested())

添加析構函數,析構函數里面這樣操作:

XXXThread:: ~XXXThread()
{
    requestInterruption();
    quit();
    wait();
}

給放在 Program Files 目錄下的 exe 添加寫入權限

由於 exe 會在本目錄下,寫入 .ini 文件,如果把 exe 制作成安裝包,會安裝到 program files 目錄下,但在 win10 下 program files 默認是沒有寫入權限的。

解決方法:

vs => 項目屬性 =>配置屬性 => 鏈接器 => 清單文件 =>UAC執行級別修改成 requireAdministrator。


error LNK2001:無法解析的外部符號_imp_timeGetTime@0

解決方法:將庫winmm.lib添加到工程中。

參考:error LNK2001:無法解析的外部符號_imp_timeGetTime@0

error LNK2019: 無法解析的外部符號


加入頭文件出現 chrono 和 ratio 的錯誤

在一個使用 FFmepg 的多線程工程中加入 librtmp 第三方開源庫,在 chrono 和 ratio 中就會報二十多個錯誤,尤其是 C4430錯誤,“C4430 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int” 這個錯誤,在網上找了很多方法均不行,直到找到這個解決辦法,前提是先include <stdint.h>

VS => 項目屬性 =>配置屬性 => C/C++ => 預處理器中加入: __STDC_LIMIT_MACROS

擴展:c++ - C++: __STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS意味著什麼?

__STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS 是一種解決辦法,允許 C++ 程序使用標准中指定的stdint.h 宏,而不在 C++ 標准中。 宏( 如 UINT8_MAXINT64_MININT32_C() ) 可能已經在 C++ 應用程序中定義為其他方式。 為了允許用戶口決定是否需要為 C 定義宏,許多實現需要在 stdint.h 包含之前定義 __STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS

參考:

加入頭文件出現ratio和chrono的錯誤

每個C11和C ++ 11,<stdint.h>不應查看__STDC_LIMIT_MACROS或__STDC_CONSTANT_MACROS


ffmpeg Common.h error C3861: “UINT64_C”: 找不到標識符

解決方法:在 common.h 中添加如下代碼:

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#ifdef _STDINT_H
#undef _STDINT_H
#endif
# include <stdint.h>
#endif

順便解決了fatal error C1189: #error : missing -D__STDC_FORMAT_MACROS這個錯誤。


ERROR: WriteN, RTMP send error 10054 (39 bytes)

時間戳過大會導致該錯誤。原先錯誤將時間戳單位弄錯了,時間戳過大,大了 1000 倍導致的。


VS出現 fatal error C1083: 無法打開包括文件: “sys/socket.h”: No such file ....

因為 sys/socket.h 是 Linux 系統下的庫文件,所以在 windows 上無法打開,用#include <winsock.h>替換即可。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM