Qt桌面客户端跨平台开发实例

        在Windows平台上,桌面客户端软件通常使用C/C++语言和Qt跨平台开发框架进行开发。因此,大部分代码可以运行于不同平台环境,但是程序运行依赖的三方库以及代码中一些平台相关的头文件和接口需要进行平台兼容。本文以windows桌面端应用迁移到Linux平台桌面端应用为例,简要叙述迁移流程及注意事项。为了迁移后应用程序能够正常运行需要做以下事情:

  1. 在Linux操作系统上部署C/C++编程语言开发环境;
  2. 在操作系统上部署Qt开发环境;
  3. 三方库获取及集成(找对应三方库的接口人,需告知其编译参数);
  4. 修改Qt工程配置文件(.pro文件)中的配置项,保证其兼容Linux平台;
  5. 修改工程中平台相关的头文件和接口(解决与平台相关的代码问题);
  6. 项目各工程编译、链接、测试验证;
  7. 问题解决,如堆在Windows和Linux上差异性引起的异常崩溃等问题。

一、三方库的获取及集成

        迁移前应用程序运行于windows平台,其依赖的第三方库文件也是于windows平台编译的,程序切换到Linux平台后,需要更换所有的三方库文件(Linux平台编译)。在与三方库的接口人对接时,需要告知其编译参数,如本文实例程序迁移到Linux平台的操作系统是x86架构的,所需三方库的

        编译链如下:make platform=aarch64-linux-gnu-483     make platform=m64x86

        镜像如下:centos6或7上用x86_64的通用编译链

        需要更换的三方库如果涉及开源库,如QtXlsx、quazip、jsoncpp等,可以通过GitHub下载对应版本的库源文件,然后使用cmake编译获取。

二、修改工程配置文件(pro文件)

        在pro文件中,对于需要区分平台的配置,可以使用win32{…}和unix:!maxc{…}的方式来解决。需要区分不同构建方式的配置,可以使用CONFIG(debug,debug|release){…}else{…}的方式来解决。

        需要修改的配置主要包括LIBS和INCLUDEPATH,在Linux平台下,静态库需要同时列出以下两项配置:

        PRE_TARGETDEPS += $$PWD/../Linux/Release/Lib/libStreamApp.a

        LIBS += -L$$PWD/../Linux/Release/Lib/ -lStreamApp

三、修改头文件和接口

        此项修改的难易程度取决于项目在开发初期的设计规划,如果项目需要跨平台兼容,在编写和设计代码模块时,尽量不要使用与平台强相关的头文件和接口,而是选择如 Boost、Qt、STL (标准模板库)等跨平台库或框架。如果实在无法此问题,推荐使用条件编译(如:#ifdef)来区分不同平台的代码。

        本文开发实例由于未考虑跨平台兼容问题,在windows平台开发时使用了不少与windows平台强相关的头文件(如windows.h)和接口(如绘图库的绘图接口Draw),导致后期迁移到Linux系统编译运行时出现了很多崩溃问题,特别是如果三方动态库的源代码与平台强相关时,问题可能只会在程序运行过程中使用这些库模块时才会出现,解决这类问题会浪费巨大的人力成本和时间成本!

四、常见问题

4.1 编译出现"cannot find -lGL"错误

        当代码中使用了gui、widgets等模块后,在编译时可能会出现错误,这是因为这类模块的头文件中包含了GL/gl.h头文件,此文件是opengl库的,即程序间接依赖opengl库,Qt默认包含了OpenGL库,因此在没有安装OpenGL库时编译Qt程序,则会出现错误。所以我们需要运行命令sudo apt-get install libgl1-mesa-dev安装gl库。

4.2 链接出现“undefined reference”错误

        如果遇到“undefined reference”错误,这通常意味着某些符号在链接时未被找到。

        第一步检查是否所有必需的库都已添加,并且路径和名称正确无误。

        第二步检查库的添加顺序是否正确。在Qt项目中,链接库的添加顺序通常遵循从左到右原则:库的添加顺序通常是从依赖最少的库开始,到依赖最多的库结束。例如,如果你的项目依赖于某个库A,而库A又依赖于库B,那么你应该先添加库B,然后是库A。

        第三步检查库是否循环依赖,确保没有循环依赖的情况发生。如果存在循环依赖,尝试重新组织项目结构或调整链接顺序。

4.3 目录路径分隔符问题

        可以使用静态函数 QString QDir::toNativeSeparators(const QString & pathName)把目录路径字符串中的斜杠分隔符转换成本地操作系统风格,在引用头文件时也要注意文件路径的斜杠是否正确,在Linux系统中使用正斜杠“/”,尤其是在界面显示时,斜杠的方向应与当前操作系统的风格匹配。

4.4 使用Windows API导致编译或运行失败

        某些Windows 应用程序中由于用到了 Windows 平台相关的 API,因而包 含了相应的 Windows 平台开发库的头文件,例如:windows.h,同时也使用了 MSVC 编译器。对于这些应用的迁移,应该首先设法去掉所涉及的 Windows 平台相关 API 及相关头文件、动态库的调用,同时在Linux平台上使用对应的实现方式来进行替代。 也可以使用条件编译(如:#ifdef)来区分不同平台的代码。

4.5 内存耗尽导致程序崩溃的问题

        本文实例软件程序涉及大量json数据的读写操作,起初我们使用c++开源库jsoncpp编写处理json的相关代码,这在windows平台下没有发生任何问题,但是在linux平台下出现了内存耗尽程序崩溃的问题,最终定位到崩溃的原因是json读写操作导致的。当我们将程序里所有json处理代码改换为Qt自身携带的json库编写后,崩溃问题得以解决。综上所述,在使用第三方开源库时,应该尽量了解三方库的特性,以防需要耗费大量时间定为问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink 内存管理

一、内存模型 上图是一个 Flink 程序进程总体的内存模型,其包含 Flink 使用内存、JVM 元空间以及 JVM 开销。 Flink 使用了堆上内存和堆外内存;框架内存使用了堆上内存和堆外内存的直接内存;Task 使用堆上内存和堆外内存的直接内存;管理内存、JVM 元空间以及 JVM 内存开销使…

【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)

数据来源:国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明:内含原始文件和匹配结果,当试点城市在2014年及以后,赋值为1;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…

git的底层原理

git的底层原理 三段话总结git, 1. 工作原理:git管理是一个DAG有向无环图,HEAD指针指向branch或直接指向commit,branch指向commit,commit指向tree,tree指向别的tree或直接指向blob。 2. git所管理的一个目录…

安装React开发者工具

我们在说组件之前,需要先安装一下React官方推出的开发者工具,首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器),在输入框内搜索react,安装如下插件: 注意安装提供方为Facebook的插件,这…

排列与二进制

#include<iostream> using namespace std; int count_two(int n,int m){int count0;for(int i0;i<m;i){ //统计2的因子个数 int numn-i;while(num%20){count;num /2;}}return count; } int main(){int n,m;while(1){cin >> n >> m;if(n0 && m0)br…

鱼书--学习2

6. 与学习相关的技巧 6.1 参数的更新 &#xff08;1&#xff09; SGD的缺点&#xff1a;SGD低效的根本原因是&#xff0c;梯度的方向并没有指向最小值的方向 基于SGD的最优化的更新路径&#xff1a;呈“之”字形朝最小值(0, 0)移动&#xff0c;效率低 &#xff08;2&#x…

基于SSM框架的汽车租赁平台(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;汽车租赁平台当然不能排除在外。汽车租赁平台是在实际应用和软件工程的开发原理之上&#xff0c;运用Java语言以及SSM框架进行开发&#x…

LangChain Chat Model学习笔记

Prompt templates: Few shot、Example selector 一、Few shot(少量示例) 创建少量示例的格式化程序 创建一个简单的提示模板&#xff0c;用于在生成时向模型提供示例输入和输出。向LLM提供少量这样的示例被称为少量示例&#xff0c;这是一种简单但强大的指导生成的方式&…

新配置了一台服务器+域名共178:整个安装步骤,恢复服务

买了一台服务器域名eesou.com&#xff1a; 服务器选的是99元最低配的&#xff0c;用免费的镜像&#xff1a;宝塔面板 eesou.com是一口价买的 79&#xff0c;原来wjsou.com卖了。 原来的配置全丢了。开始重新安装步骤。 域名备案才能用&#xff0c;提交就等着了 服务器配置 …

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

我的uniapp自定义模板

uniapp自定义模板 如有纰漏请谅解&#xff0c;以官方文档为准后面这段时间我会学习小程序开发的知识&#xff0c;会持续更新可以查看我的github&#xff0c;后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站&#xff0c;我会在上面持续更新内容&#xff0c;…

Wispr Flow,AI语言转文字工具

Wispr Flow是什么 Wispr Flow 是AI语音转文本工具&#xff0c;基于先进的AI技术&#xff0c;帮助用户在任何应用程序中实现快速语音转文字。 Wispr Flow支持100多种语言&#xff0c;具备自动编辑、上下文感知和低音量识别等功能&#xff0c;大幅提升写作和沟通效率。Wispr Fl…

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

浔川社团官方联合会维权成功

在2025.3.2日&#xff0c;我社团检测文章侵权中&#xff0c;检测出3篇文章疑似遭侵权&#xff0c;随后&#xff0c;总社团联合会立即联系CSDN版权&#xff0c;经过17天的维权&#xff0c;至今日晚&#xff0c;我社团维权成功&#xff01;侵权文章全部被设置为转载。 在此&…

linux中如何修改文件的权限和拥有者所属组

目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下&#xff1a; u代表的是拥有者&#xff0c;g代表的是所属组&#xff0c;o代表的是其他人&#xff0c;a表示所有人&#xff0c;如果你想增加权…

SmolVLM2: 让视频理解能力触手可及

一句话总结: SmolVLM 现已具备更强的视觉理解能力&#x1f4fa; SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型&#xff0c;转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规…

人工智能将使勒索软件更加危险

Ivanti 预测&#xff0c;勒索软件将成为 2025 年的最大威胁&#xff0c;这一点尤其令人担忧&#xff0c;因为 38% 的安全专家表示&#xff0c;在人工智能的帮助下&#xff0c;勒索软件将变得更加危险。 与威胁级别相比&#xff0c;只有 29% 的安全专家表示他们对勒索软件攻击做…

UE AI 模型自动生成导入场景中

打开小马的weix 关注下 搜索“技术链” 回复《《动画》》 快速推送&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;

Debain-12.9使用vllm部署内嵌模型/embedding

Debain-12.9使用vllm部署内嵌模型/embedding 基础环境准备下载模型部署模型注册dify模型 基础环境准备 基础环境安装 下载模型 modelscope download --model BAAI/bge-m3 --local_dir BAAI/bge-m3部署模型 vllm serve ~/ollama/BAAI/bge-m3 --served-model-name bge-m3 --t…

电子学会—2023年12月青少年软件编程(图形化)三级等级考试真题——打砖块游戏

完整题目可查看&#xff0c;支持在线编程&#xff1a; 打砖块游戏_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/scratch/show-5112.html?_shareid3 程序演示可查看&#xff0c;支持获取源码&#xff1a; 打砖块游戏-scratch作品-少儿编程题库学习中心…