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.mzph.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;它允许你将应用程序及其依赖项打包到一个称为"容器"的封闭环境中。每个容器都包…