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生成是靠代码控制。

         对于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静态链接库。

           下一步,将成功生成的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,具体安装步骤不再详述。

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

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

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


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

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

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

  • 18
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Linux上开发的Qt应用程序发布到Windows平台,需要进行以下步骤: 1. 编写跨平台Qt代码:Qt是一个跨平台开发框架,可以方便地在不同操作系统上开发应用程序。因此,在开发过程中应遵循跨平台的开发规范,并测试保证在Linux上的稳定性。 2. 配置Windows开发环境:在Windows平台发布Qt应用程序之前,需要先在Windows机器上搭建Qt开发环境。通过下载并安装QtWindows版本,配置相应的编译器和开发环境。 3. 导入项目文件:将在Linux上编写的Qt项目文件(.pro文件)导入到Windows开发环境中。确保项目文件和相关的源码、资源文件等文件完整且正确。 4. 编译项目:使用Qt开发环境中的编译器,对项目进行编译和构建。确保编译过程中没有错误,并生成可执行文件。 5. 测试应用程序:在Windows上运行已编译的应用程序,并进行功能测试和兼容性测试。确保应用程序在Windows平台上的正确运行和稳定性。 6. 打包发布:对应用程序进行打包,生成一个可执行的安装程序(.exe文件)。可以使用Qt开发环境中的Qt Installer Framework或其他打包工具。 7. 发布应用程序:将生成的安装程序上传到适当的发布平台,如Windows应用商店、软件下载网站等,以供用户下载和安装。 需要注意的是,在发布到Windows平台之前,还需要确保应用程序在Windows上的依赖库(如动态链接库)已正确设置,并与应用程序一起打包。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值