Qt 加載 libjpeg 庫出現“長跳轉已經運行”錯誤

在我以為升級到 Qt5.15.9 后,運行沒有什么問題時,問題就來了

在加載 jpeg 格式的圖片時,出現了“長跳轉已經運行”的錯誤

這個錯誤一般是由 setjmp/longjmp 函數觸發的,出現的可能的原因有以下幾種(聽聽 chatgpt 的回答)


longjmp 是 C 標準庫中的一個函數,用于跳轉到之前通過 setjmp 函數設置的跳轉點,并在跳轉時返回指定的錯誤碼。如果在調用 longjmp 函數時出現錯誤,通常會表現為程序異常終止、崩潰或死鎖等問題。

longjmp 函數可能出現錯誤的原因和解決方法如下:

  1. 調用 setjmp 的函數已經返回

使用 longjmp 函數必須要在之前調用過 setjmp 函數并且還沒有從 setjmp 函數返回時才能使用。如果在 setjmp 函數返回后再調用 longjmp 函數,就會導致未定義行為,可能會導致程序崩潰或死鎖。解決方法是檢查 longjmp 函數的調用時機,并確保它是在 setjmp 函數之后而且還沒有從 setjmp 函數返回時調用的。

  1. 跳轉目標不存在

當 longjmp 函數嘗試跳轉到之前設置的跳轉點時,如果該跳轉點已經不存在,就會導致錯誤。這種情況通常發生在跳轉點所在的函數已經返回或者被釋放時。解決方法是檢查跳轉點是否存在,并確保跳轉點所在的函數仍然有效。

  1. 跨線程調用

longjmp 函數通常不適用于多線程程序。如果在一個線程中設置了跳轉點,然后在另一個線程中調用 longjmp 函數來跳轉到該點,就會導致未定義行為。解決方法是使用線程安全的異常處理機制來代替 longjmp 和 setjmp 函數。

  1. 其他原因

除了上述幾種情況外,還有可能是其他一些原因導致 longjmp 錯誤。例如,內存泄漏、非法指針訪問、堆棧溢出等問題都可能導致 longjmp 函數失敗。解決方法是根據具體錯誤信息進行排查和修復。


我這邊是觸發 ERREXIT2 后而跳出的錯誤

ERREXIT2 的原型如下

觸發 ERREXIT2,進入 my_error_exit 函數,然后調用 longjmp,最后程序異常崩潰

為何有這種丑陋的報錯呢?官方應該可以把這種報錯 catch 下來,而不是讓程序閃退,看看 llbjpeg-turbo 作者給出的解釋

原始鏈接:Possibility of non-unwinding error handling

簡單說來,ERREXIT 是官方的 libjpeg 遺留下來的,代碼很古老,至今沒人修,而 libjpeg-turbo 只是包裝了 libjpeg 庫,這樣加載更快,對 libjpeg 中的 api 沒有任何改變,他也可以幫忙包裝下這個報錯,只是要加錢

話說回來,我為何會遇到 ERREXIT 呢?

那就不得不說 Qt 對 5.15 后續版本做出的一些改動了

見:LibJPEG-turbo, version 2.1.5 | Qt GUI 5.15.14

就是說 libjpeg 要你自己去鏈接,我們不再幫你集成到 qjpeg.lib 中了,可能是協議問題

Independent JPEG Group License and BSD 3-Clause "New" or "Revised" License and zlib License.

既然問題找到了,那解決方法“應該”也能浮出水面了,對,打上雙引號的應該

事實上是我低估了這個問題,原本我以為加個 libjpeg-turbo 的庫之后就能萬事大吉時,結果往往給你一個嘴巴子

我用 vcpkg 包管理器添加了 libjpeg-turbo:x86-windows-static,程序編譯通過,也沒有出現 ERROR2019 的錯誤,但是使用 loadFromData 加載 jpeg 圖片數據還是會報錯

1

2

QImage photo;

photo.loadFromData(buffer.GetBuffer(), buffer.GetBufferLen());?// buffer 里放置 jpeg 圖片數據

我第一反應是 libjpeg-turbo 的庫版本太高了,就查閱低版本的庫,想通過 vcpkg 新出的版本控制來實現的,奈何水平有限,沒弄出來,就去官網下載?2.1.3?的壓縮包自己編譯

之所以編譯 2.1.3 的包,是因為 Qt5.15.9 版本將 libjpeg-turbo 更新至 2.1.3

見:qt/qtreleasenotes.git - Unnamed repository; edit this file 'description' to name the repository.

編譯出一個 lib 庫后,鏈接到程序中,還是會報錯,嗯,那先排除 libjpeg 版本問題

從堆棧下手吧,一層一層的剝開問題表皮,看本質

報錯是停在紅框中的 ERREXIT2 中,單步調試后發現,qt 里要求 libjpeg-turbo 的 version 為 80,而 vcpkg 提供的所有 libjpeg-turbo 版本都是 62,可以在 jconfig.h 中查看 version

嗯,80 的為 qt 專屬,這就解釋了為啥觸發了 ERREXIT2 了,順便說一句,vcpkg 提供的庫其實就是官方的庫,libjpeg-turbo 不管是 2.1.5 還是 2.1.3,JPEG_LIB_VERSION 都是 62

因此我們只要編譯一個 libjpeg 的 qt 三方庫就行了

借助這篇教程,

使用 Qt Creator(我使用的 Qt Creator 10.0.0) 打開 libjpeg.pro,再在 .pro 文件里改 lib 輸出路徑就行

順便貼上構建設置

可能需要將 jom.exe 改成 nmake.exe(打開 pro 項目后,在構建和運行中選擇)

這些都準備后,點擊編譯即可,在 lib 文件夾中就可以找到了

把庫放到項目文件的庫目錄下,并靜態綁定即可


是不是很復雜,直到上一步我也是這么以為的,在我全局搜索 qtlibjpeg.lib 時,我發現 qt 下已經給你編譯好了

驚不驚喜意不意外(我都要罵娘了)

重新閱讀了官方文檔,上面說你可以選擇在編譯靜態庫時添加一些參數來一起編譯你需要的三方庫,比如 libjpeg

見:Qt Configure Options | Qt 6.0

是我大意了,附上編譯命令,

1

configure -static?-static-runtime -debug-and-release -mp -prefix?"..\msvc2019_x86_static"?-opensource -confirm-license -optimize-size -qt-libjpeg -make libs -nomake examples -nomake tests -skip qtwebengine

編譯出的庫文件就在 lib 下

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37448.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常用的免費敏捷工具

? Scrum中非常強調公開、透明、直接有效的溝通,這也是“可視化的管理工具”在敏捷開發中如此重要的原因之一。通過“可視化的管理工具”讓所有人直觀的看到需求,故事,任務之間的流轉狀態,可以使團隊成員更加快速適應敏捷開發流程…

VMware Workstation 如何啟用復制粘貼

產品:VMware Workstation 16 Pro 版本:16.1.1 build-17801498 我們剛安裝好的 VMware Workstation 會發現無法復制粘貼文件到虛擬機中,如下為解決方案: 1.點擊 虛擬機,點擊 安裝 VMware Tools(T)...。 2.虛擬機下面會…

詳細安裝配置django

安裝配置使用Django。 1,下載安裝 django pip install django 2.創建設置項目 先進入要放置項目的文件夾下 2.1, 創建項目 django-admin startproject Api_project 2.2, 創建app命令 cd Api_project dir看一下是否有 manage.py 文件…

ASPICE流程發布和維護

ASPICE流程發布和維護是指在軟件開發完成后,將軟件發布給客戶,并進行維護和支持。這一過程包括以下步驟: 軟件發布:將符合ASPICE標準的軟件發布給客戶,確保軟件可以正常運行并滿足客戶需求。 用戶培訓:對客…

23牛客多校9 I Non-Puzzle: Segment Pair

也許更好的閱讀體驗 D e s c r i p t i o n \mathcal{Description} Description 給 n n n對區間,要求每對區間恰好選一個使得選出來的 n n n個區間有交集,問有多少方案數 1 ≤ n , l i , r i ≤ 5 1 0 5 1\le n, l_i,r_i\le 510^5 1≤n,li?,ri?≤510…

2023-08-11 LeetCode每日一題(矩陣對角線元素的和)

2023-08-11每日一題 一、題目編號 1572. 矩陣對角線元素的和二、題目鏈接 點擊跳轉到題目位置 三、題目描述 給你一個正方形矩陣 mat,請你返回矩陣對角線元素的和。 請你返回在矩陣主對角線上的元素和副對角線上且不在主對角線上元素的和。 示例 1&#xff1…

企業計算機服務器中了Devos勒索病毒怎么辦,勒索病毒解密

社會在發展,科技在進步,企業的生產也得到了很大改善,但是隨著網絡技術的不斷發展,越來越多的企業遭到的網絡安全威脅開始增多,其中較為明顯的就是勒索病毒攻擊。預防勒索病毒攻擊成為日常生活中不可或缺的一部分工作。…

8,四個類型轉換const_cast、reinterpret_cast、dynamic_cast、static_cast

類型轉換const_cast、reinterpret_cast、dynamic_cast、static_cast const_castreinterpret_castdynamic_caststatic_cast const_cast 被const修飾的函數可以被訪問&#xff0c;但是不能被修改成員變量 const_cast可以去掉const #include <iostream> using namespace s…

SyntaxError: Cannot use import statement outside a module

node環境運行報錯&#xff1a; 解決步驟&#xff1a; 1. npm init -y 2. 在 package.json 文件中加入一條&#xff1a;"type": "module", 3. 保存后再執行即可 附&#xff1a;最好是不要在node用import&#xff0c;否則需要上次配置 建議1&#xff1a;用re…

el-table實現靜態和動態合并單元格 以及內容顯示的問題

實現效果圖 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序號" width"50"><el-tab…

Detecting Twenty-thousand Classes using Image-level Supervision

Detecting Twenty-thousand Classes using Image-level Supervision 摘要背景方法PreliminariesDetic:具有圖像類別的檢測器loss技術細節擴展Grad-CAMGrad-CAM原理 總結 摘要 摘要 由于檢測數據集的規模較小&#xff0c;目前的物體檢測器在詞匯量方面受到限制。而圖像分類器的數…

LeetCode_03Java_1572. 矩陣對角線元素的和

給你一個正方形矩陣 mat&#xff0c;請你返回矩陣對角線元素的和。 請你返回在矩陣主對角線上的元素和副對角線上且不在主對角線上元素的和。 輸入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 輸出&#xff1a;25 解釋&#xff1a;對角線的和為&#xff1a;1 5 9 3 7 2…

Scratch 之 3D 介紹及教程

第一章 為什么 3D 很難&#xff1f; 1.1 3D 難在何處&#xff1f; 3D 之所以會使我們覺得困難&#xff0c;是因為 Scratch 軟件只有兩個坐標軸&#xff0c;既&#xff1a;X軸、Y軸。 2維坐標系 而 3D 卻擁有三個坐標軸&#xff1a; 3維坐標系 怎么辦&#xff1f;很簡單&…

Gin各種參數接收

Gin參數接收 文章目錄 Gin參數接收1.各個參數的接收方法Gin中發送JSON數據Gin接收querystring數據Gin接收Form的參數Gin接收URI參數 2.參數綁定方式接收(更加方便)推薦一款軟件 1.各個參數的接收方法 聲明: 這里的c都是c *gin.Context中的c Gin中發送JSON數據 在傳輸或接受JS…

33 | 美國總統數據分析

在這個數據分析項目中,利用Pandas等Python庫對美國2020年7月22日至2020年8月20日期間的超過75萬條捐贈數據進行了深入的探索和分析。通過這一分析,他們揭示了這段時間內美國選民對總統候選人的偏好和捐款情況。以下是對文章中的主要步驟和內容的進一步描述: 數據集處理: 作…

Jquery 復選框點擊生成標簽 源代碼

html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>服務資源管理</title><link rel"stylesheet" type"text/css" href"../lib/layui/css/layui.css" /><link rel"st…

2023牛客第八場補題報告A H J K

2023牛客第八場補題報告A H J K A-Alive Fossils_2023牛客暑期多校訓練營8 (nowcoder.com) 思路 統計字符串&#xff0c;取出現次數為t的。 代碼 #include <bits/stdc.h> #define int long long #define endl \n #define IOS ios::sync_with_stdio(0), cin.tie(0), …

【C++】面試題

1、都說c是面向對象的語言&#xff0c;面向對象的三個特性能 [展開] 介紹一下嗎&#xff1f; 封裝&#xff1a;封裝是一種集中管理的思想&#xff0c;把內部的數據和實現方法組合在一起&#xff0c;并且不對外暴漏內部的數據和實現方法&#xff0c;只對外提供幾個接口來完成函數…

DockePod信號處理機制與僵尸進程優化

Docke&Pod信號處理與僵尸進程優化 容器與信號的關系 SIGTERM信號&#xff1a;程序結束(terminate)信號&#xff0c;這是用來終止進程的標準信號&#xff0c;也是 kill 、 killall 、 pkill 命令所發送的默認信號。與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程…

k8s和docker簡單介紹

當涉及到容器技術和容器編排時&#xff0c;Docker和Kubernetes是兩個重要的概念。我將更詳細地介紹它們以及它們之間的關系。 Docker&#xff1a; Docker是一種容器化技術&#xff0c;它允許你將應用程序及其依賴項打包到一個稱為"容器"的封閉環境中。每個容器都包…