qt跨平台Linux到windows,Qt实现软件从Windows到Linux跨平台

Qt,面向C++图形界面的一种架构,对于GUI有很好的扩展,通过近一个月的学习和摸索,终于实现了Windows下的软件代码移植到Linux,实现了软件的跨平台。这其中走了不少弯路,遇到很多问题,主要是通过Internet找资料,上论坛求助,才使得最终成功,所以这也是我写这篇博文的初衷,希望能通过自己的经验总结,能够让更多像我一样的菜鸟少走弯路,走的更远。。。

首先,介绍一下:为什么要用Qt?因为我们自己开发了一个小软件,在Windows下用C++写的代码,其中主要调用了MKL和Opengl两个库,我们的目的是想将我们的软件推广,让更多的人来使用我们的软件,那就希望除了在Windows下,在Linux(国外较多)环境下也能使用我们的软件,这就是要实现软件跨平台,那跨平台就必然涉及到了底层代码层的东西,首先要选择跨平台的工具,通过网上搜集资料,最终确定使用Qt。

其次,确定使用Qt后,光靠Qt行不行?Qt是面向对象的GUI,涉及到代码层、MKL库、Opengl库等最根本的东西时候还需要其他的工具进行辅助,那我就将我们开发使用的工具做以介绍,从代码最底层开始,在进行Qt开发时候,代码层是以静态库的形式链接到Qt的工程文件中,因此大量的底层代码都是以库的形式存在,在Windows下是以.lib形式存在,在Linux下是以.a或者.so形式存在,那么使用什么工具进行代码管理呢?我们选用的是Cmake进行代码编译生成库,其中Cmake在Windows和Linux下都能使用,Cmake的使很强大,就我个人而言,它能将.cpp以及.h等大量的代码及头文件统一管理,代码、库、头文件非常清晰明了,对于一个工程软件的理解思路很清晰,Cmake的语法很好掌握,下载Cmake的使用手册,然后按照手册中的例程走一遍,很多语法都是固定的,比如最简单的Hello Word!很多人都是从这开始学的吧,呵呵,我当时也是找了一个最简单的Hello Word!将Cmake的使用从头到尾熟悉了一遍,然后再在简单的基础上进行复杂扩展,其实只要最简单的东西熟悉了,难的也就变得简单了,因为难的是在简单的基础上迭代、扩展,基础的东西熟悉了可以少走弯路,对于Cmake我就简单介绍,具体细节可参照网上其他Cmake具体资料,我这里主要将我们跨平台的宏观大体思路进行介绍,涉及到细节的东西不做深入探讨,如果你能使用Cmake生成代码库:.lib,.a,.so那么你离成功就近了一步,那进行Windows向Linux跨平台时候,主要生成Linux下的.a和.so即可,.a是静态库,.so是动态库,下图显示成功生成了.a和.so库文件,.a和.so生成是靠代码控制。

0818b9ca8b590ca3270a3433284dd417.png         对于Cmake进行代码生成库时候,我的经验是不用添加代码所涉及到的MKL等数学库,我理解的是Cmake只在代码层面对对软件代码进行管理和编译,它不涉及到函数功能是否实现,意思就是Cmake不管你这个函数是否能使现相应的函数功能,我只需在我Cmake 编译的时候能找到代码中出现的函数名即可,比如vslNewStream()函数,我不要求我在mkl数学库中能实现你的函数功能,我只需要在Cmake编译时,我在mkl的头文件定义中能找到vslNewStream函数名称即可,那Cmake核心要求就需要你要将代码中涉及的代码以及头文件的路径要全部加对,即Cmake语法中include_directories()是核心的东西,不能出错,Cmake成功generate之后只是说明你的Cmake工程管理代码的语法没问题,要涉及底层.cpp代码没问题,还需要在Linux用make来检验代码并生成最终的.a和.so库,cd到由Cmake生成的Build文件下,一般生成了Makefile文件,make主要是针对Makefile进行操作编译,下图表示成功生成libmose.a静态链接库。

0818b9ca8b590ca3270a3433284dd417.png

下一步,将成功生成的libmose.a静态链接库加入到Qt工程文件中,注意,现在所加的.a静态库只是在Qt中加入了代码管理库,其相当于逻辑集成库,因此当程序代码真正要实现功能时,比如要进行函数调用时,那么现在就要加入mkl等库文件,mkl库中有.a库中代码调用相应函数功能的函数,例如上述提到的vslNewStream()函数功能的实现定义在libmkl_intel_lp64.a中,因此只需要将代码中涉及到所有函数以及变量全部统一加入到Qt工程文件中,那么整个软件工程才能统一正常运转工作。在Linux下安装Qt,我们安装的Qt版本为QT Library: 4.8.1,QT Creator:2.4.1,Ubuntu:12.04,具体安装步骤不再详述。

0818b9ca8b590ca3270a3433284dd417.png

然后很重要,也很麻烦的一步,在Qt中添加库,由于开始对Qt不熟悉,所以在这一步卡了很长时间,主要问题还是出现在Windows代码移植到Linux环境下容易出现问题,还有就是Qt对代码要求很严格,不能出现任何细小的疏忽和错误,否则就会出现undefined referenced to' ... ',这几乎是所有初学Qt的人都要经历的过程,因为Qt对代码的苛刻,所以你代码无论出现什么问题,它都会出现上述错误,正因为非常常见,不能具体到对应代码错误,因此解决起来也很头疼,网上也给了一些解答,我觉得每个人遇到的问题都不一样,因此具体问题具体分析,通过自己深入理解代码,分析和解决undefinded reference to 这一错误。Qt对代码层面要求很苛刻,举例说明,比如当代码要调用MKL库时,.a库的调用顺序不一样都会出现错误,因此初学者一定要小心,否则你会陷入undefined referenced to 的泥潭无法自拔,比如:

0818b9ca8b590ca3270a3433284dd417.png

程序成功运行,而当我将LIBS += 顺序变换一下时,编译就会出错。如下图:

0818b9ca8b590ca3270a3433284dd417.png

在进行Qt工程文件添加.a库时,INCLUDEPATH += 同样重要,注意这里的路径一定要和libmose.a代码头文件路径以及调用的MKL头文件一致,否则会出错,可能会有人问为什只加入.h文件即可,原因是你Cmake,make编译生成的libmose.a中包含了.cpp代码文件,Qt中工程编译时,加入相应代码的.h头文件来定义相应的.cpp中的函数、变量定义即可,前面说到Cmake是进行代码管理打包生成代码链接库,那么在Qt中就要真正的调用函数,进行实战,我理解的是Qt是干实事的,Cmake之是做做表面工作(可能理解的不准确),那我在验证仿真程序时,是利用Qt中按钮触发事件信号槽机制来触发进行仿真程序运行,如何设置按钮触发在Qt例程中,网上有现成代码,直接copy过来就能用。

0818b9ca8b590ca3270a3433284dd417.png

这是Qt信号槽按钮触发界面,也就是当点击yes时,信号触发连接到软件仿真程序,程序就开始运行,下图是点击yes按钮后仿真结果

0818b9ca8b590ca3270a3433284dd417.png

那么以上调用MKl库就完成,下面要调用Opengl库进行显示,前面说实现Windows到Linux跨平台,其实最麻烦的是Opengl库中涉及到Windows.h等Windows下的系统文件如何实现在Linux下的替换和移植,我开始还幻想着通过自己写Windows.h在Linux下相应的API,结果发现工程量太大,结果放弃了,后来想直接调用Qt下的QtOpengl,因为Qt本身是针对跨平台的,因此QtOpengl就不会涉及到Windows到Linux的问题,后来通过简单调用QtOpengl实现简单显示三维圆柱体。

0818b9ca8b590ca3270a3433284dd417.png

那么Qt实现跨平台,调用MKL、Opengl库的工作基本告一段落,下面主要是将上述仿真结果参数写入QtOpengl中,那么就实现了Linux下Qt对代码仿真、显示一体化的功能,再进行后期的代码、算法优化,即实现将Windows下的软件移植到Linux下,实现软件跨平台。

  • 0
    点赞
  • 6
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值