Linux下QT程序启动失败问题排查方法

news2024/12/25 14:58:51

文章目录

      • 0.问题背景
      • 1.程序启动失败常见原因
      • 2.排查依赖库问题
        • 2.1 依赖库缺失
        • 2.2 依赖库加载路径错误
        • 2.3 依赖库版本不匹配
        • 2.4 QT插件库缺失
          • 2.4.1 QT插件库缺失
          • 2.4.2 插件库自身的依赖库缺失
        • 2.5 系统基础C库不匹配
      • 3.资源问题
        • 3.1 缺少翻译文件
        • 3.2 缺少依赖的资源文件
        • 3.3 缺少依赖的可执行程序
      • 4.程序权限问题
      • 5.运行崩溃问题

0.问题背景

在当前的主流开发语言中Java和web都有成熟的包依赖管理工具,能够轻松的管理程序依赖,然而C++目前仅仅只有像vcpkg和conan这样的开源库构建工具,并没有程序依赖库管理工具。在Linux系统软硬件如此丰富的今天,想一个C++程序能够兼容多个操作系统,是一件很有挑战的事情。下面文章中将要讲到的是平时在实践过程中遇到的一些问题的总结分享,希望能给读者一些启发。

1.程序启动失败常见原因

Linux下程序启动失败的原因主要有几个原因,下面将从每个原因进行具体的分析。

请添加图片描述

2.排查依赖库问题

2.1 依赖库缺失

通过ldd命令查看依赖库问题的正确步骤,第一步先确认可执行程序的依赖库是否缺失,如果缺失查看缺失依赖库自身的依赖库是否正常,通过一层层查询,基本能定位缺失的依赖库问题。

#查看可执行程序依赖库示例
ldd -d example

#查看动态库的依赖库
ldd -d libQt5Gui.so

请添加图片描述
依赖库缺失示例:
请添加图片描述

2.2 依赖库加载路径错误

因为windows和Linux系统机制的问题,Linux默认从系统路径加载动态库,这导致程序启动时加载的不是当前路径下的动态库,如果版本不匹配就会出现程序启动失败。解决这个问题的办法有两个:1.编译动态库时指定需要链接动态库的相对路径;2.通过pathelf命令修改动态库的运行时路径。

2.3 依赖库版本不匹配

依赖库版本不匹配的情况一般有两种情况,第一种动态库编译环境编译时依赖的动态库版本和运行环境中依赖的库版本不同,这就导致运行时库版本不匹配,最常见的问题像libicui18n.so、libicudata.so、libssl等。

请添加图片描述

2.4 QT插件库缺失

QT自带插件是在使用特定模块时必须依赖的动态库,在发布程序时必须一起发布,但是因为我们在开发阶段因为开发环境的的问题很容易忽视这个问题,导致在纯净环境部署时出现程序因为缺少必须的插件库而无法运行。

请添加图片描述

2.4.1 QT插件库缺失

解决QT插件库缺失的两种方法,第一种利用经验根据自己使用到的板块拷贝对应的插件到发布目录;第二种方法利用开源工具linuxdeployqt自动拷贝所有依赖的Qt环境到发布目录。

2.4.2 插件库自身的依赖库缺失

QT插件库很多是依赖系统库的,比较典型的是libqxcb.so依赖libxcb-xinput.so,很多系统没有这个依赖环境,因此在打包时我们需要将这个系统依赖库放到我们发布目录进行一起发布。

2.5 系统基础C库不匹配

当我们使用高版本的gcc编译器编译程序在低版本的gcc系统中运行时很容易出现C库找不到的问题,主要是因为使用高版本gcc进行编译时会引入高版本c库的函数,而在低gcc环境上是没有这些函数的,这就导致程序找不到依赖的c库的接口而无法启动。

3.资源问题

3.1 缺少翻译文件

Qt的QWebEngine模块强依赖翻译文件,在缺失翻译文件时程序直接启动失败。解决办法需要将QT安装目录下的translations文件夹放到发布目录的根目录,尤其是其中的qtwebengine_locales文件夹一定不能少。

3.2 缺少依赖的资源文件

Qt的QWebEngine模块强依赖翻译资源文件,在缺失资源文件时程序直接启动失败。解决办法是将QT安装目录下的resources文件夹放到发布目录的根目录。

3.3 缺少依赖的可执行程序

Qt的QWebEngine模块依赖QtWebEngineProcess进程和qwebengine_convert_dict可执行程序,缺少这两个文件程序将无法启动。QtWebEngineProcess是chromium内核的独立进程,为了避免chromium内核崩溃导致主进程崩溃QT设计人员将其独立成了一个单独的进程,所以这个在做嵌入网页的功能时是必不可少的。

4.程序权限问题

权限问题是linux下非常常见的问题,主要有两种操作可能出现权限问题,第一种我们的软件安装是是非root权限安装的软件,第二种是我们替换软件目录的可执行程序导致可执行无运行权限。对于第一种我们只能卸载重装使用有root权限的账号进行安装,第二种情况我们可以使用chmod命令修改权限即可。

5.运行崩溃问题

程序启动运行崩溃看起来像程序运行不起来,这是程序本身代码的问题,有两种方法可以进行排查。第一种拿到程序崩溃生成的core文件使用gdb查看调用栈进行分析,第二种通过strace命令启动应用程序,可以查看详细的程序加载过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库安装

1.选择最下面自定义安装 2.选择x64 3.next 4.完成后next 5.next 6.选择如图,next 7.如图 8.输入密码 9.如图 10.如图 11.安装 12.完成 13.控制面板选择系统和安全 14.选择系统 15.高级系统设置 16.环境变量 17.双击打开path 18.新建 19.输入MySQLbin文件夹路径 20.管…

年互动量破亿,小红书流量新风口趋势研究

当今时代,一个人生活已经成为越来越常见的状态。千瓜数据显示,近一年小红书有关“一人生活”的种草笔记数超百万,预估互动量达亿级,“一人”市场大有可为。 本期,千瓜将探索“一人生活”的新变化,深入分析人…

Modbus RTU协议简介即CRC算法实现

目录 1 Modbus 介绍2 Modbus RTU协议传输方式2.1 地址码2.2 功能码2.3 数据码2.4 校验码 3 CRC算法实现2.1 代码3.2 运行结果 1 Modbus 介绍 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编…

谷粒商城-个人笔记(集群部署篇一)

前言 ​学习视频:​Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强​学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

每日一题——力扣144. 二叉树的前序遍历(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法: 代码结构 时间复杂度 空间复杂度 总结 我要更强 代码说明 …

mysql 忘记 root 密码的解决办法(针对不同 mysql 版本)

文章目录 1.前提说明1.1 cmd 窗口打开方式1.2 mysql 服务相关命令知识补充1.3 三个 mysql 版本说明1.4 运行时可能发生的报错问题🍀 跳过密码授权命令报错🍀 修改密码时报错🍀 ERROR 2003 (HY000): Cant connect to MySQL server on localhos…

安卓稳定性之crash详解

目录 前言一、Crash 的基本原理二、Crash 分析思路三、实例分析四、预防措施五、参考链接 前言 在开发和测试 Android 应用程序时,遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行,并且导致应用强制关闭。 一…

RabbitMQ 进程内流控(Flow Control) 源码解析

1. 概述 1.1 为什么要流控? 流控主要是为了防止生产者生产消息速度过快,超过 Broker 可以处理的速度。这时需要暂时限制生产者的生产速度,让 Broker 的处理能够跟上生产速度。 Erlang进程之间不共享内存,每个进程都有自己的进程邮…

什么是眼球凹渲染?如何在Varjo Base中设置眼球追踪与凹渲染功能

当谈到Varjo耳机时,它们总是与超高分辨率显示器和有凹渲染联系在一起,从而能够高效地渲染到高像素的显示器上。 本篇博文的主题是分享一些可用于OpenXR应用程序的新设置,但在此之前,让我们先了解关于有凹渲染的一些背景。有凹渲染…

【计算机毕业设计】基于Springboot的B2B平台医疗病历交互系统【源码+lw+部署文档】

包含论文源码的压缩包较大,请私信或者加我的绿色小软件获取 免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

Python爬取国家医保平台公开数据

国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等,数据都能爬 接口地址:/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数:signData {dat…

H5打包失败:JS堆内存不足

傻子没看懂报错,像个无头苍蝇 解决方式:清空缓存,重启电脑,打包成功。

二叉树中序遍历-递归法详解-数据结构与算法

首先看下中序遍历的代码:(左 跟 右) 其首先要接受一个根结点root作为参数 判断根节点是否为NULL 不为NULL则递归遍历左子树 ①我们把树根结点A传递给它 其左结点为B,右结点为C ②首先我们要检查root是否为NULL 其不为NULL …

使用pyinstaller 如何打包python项目

参考:【python项目正确打包方法-哔哩哔哩】 https://b23.tv/EDB6zbG Pyinstaller 详解多种打包过程(去坑,填坑)。_pyinstaller -f -w-CSDN博客 1.打开命令提示符: 找到python项目所在位置,输入cmd即可 2. 安装pipenv: 在命令提示符&#…

1000T的文件怎么能快速从南京传到北京?最佳方案你肯定想不到

今天刷面试题看到一个有意思的面试题, 1000T的文件怎么能以最快速度从南京传到北京? 网络传输 首先我们考虑通过网络传输,需要多长时间。 我特地咨询了在运营商工作的同学,目前带宽: 家庭宽带下行最大1Gbps&#…

x264 编码器汇编模块介绍

aarch64汇编架构 解释:AArch64 是 ARM 架构的 64 位版本,也称为 ARMv8-A特点: 64位寻址能力,支持更大的地址空间,理论上可达16EB(Exabyte)使用64位宽的寄存器,有31个通用寄存器(X0-X30),外加一个链接寄存器(X31)支持扩展的 NEON SIMD 指令集,提供更多的执行单元和…

电脑显示由于找不到MSVCP140.dll,无法继续执行代码

电脑已经成为我们生活和工作中不可或缺的工具,然而,在使用电脑的过程中,我们常常会遇到一些错误提示,其中之一就是“电脑显示由于找不到MSVCP140.dll是怎么回事?”这个问题。小编将详细介绍该问题的原因、解决方法以及…

新版本发布丨昂辉科技EasySAR-Configurator V1.2.0再启航

昂辉科技新一代跨平台高性能AUTOSAR配置工具EasySAR-Configurator V1.2.0全新版本重磅发布!产品基于Web架构前后端分离的方式开发,可提供SaaS部署,能够实现精准配置和最大限度的代码裁剪,且配备标准的约束限制、配置验证、代码生成…

技术成神之路:设计模式(二)建造者模式

1.定义 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…

基于字符和词特征融合的恶意域名检测

传统的恶意域名检测方法在检测由域名生成算法(DGA)随机生成的恶意域名方面性能不佳,尤其是对于那些由随机单词组成的域名。文章提出了一种新的检测算法,通过融合字符和词特征来提高对恶意域名的检测能力,特别是对于更具…