设为首页 收藏本站
查看: 1009|回复: 0

[经验分享] 【golang-GUI开发】项目的编译

[复制链接]

尚未签到

发表于 2018-9-20 11:42:28 | 显示全部楼层 |阅读模式
  在上一篇文章里,我们讲到了安装therecipe/qt(https://www.cnblogs.com/apocelipes/p/9296754.html),现在我们来讲讲如何编译使用了therecipe/qt的项目。
  therecipe/qt以下简称qt,和Qt加以区分。
  为什么不直接使用go build
  因为qt使用了moc技术(元对象编译器),对于一些Qt的扩展语法需要进行额外的处理,用C++写过Qt项目的读者应该知道不能直接用g++或者其他编译器去编译项目代码,而是通过qmake生成的Makefile进行构建,而在这个Makefile文件里就使用了moc程序来处理Q_OBJECT这样的扩展语法,处理完成后再交由C++编译器编译。golang也是同样的流程,只不过不用自己配置qmake,而是用一条qtdeploy命令就能完成项目的编译了。
  当然使用go build也是可行的,如果你不需要qtdeploy生成的额外内容,使用如下命令即可:
  

cd your_project  
qtmoc # 使用moc处理Qt扩展语法
  
qtrcc # 如果使用了qrc机制需要使用此命令
  
go build
-o project_name  

  之后等待一段时间,会在目录下生成可执行程序。这个程序是动态链接的,所以需要运行程序的目标机器安装有相应的依赖。
  因为目标环境可能不会安装有这些依赖,所以这时候我们就可以用qtdeploy解决问题。
  编译
  编译很简单,一条命令搞定:
  

qtdeploy build [target] [path/to/your/project]  

  target是指定的目标平台,编译完成后的程序将可以在target指定的平台上运行。
  如果也可以将target设为desktop,qtdeploy将会根据本地环境选择相对应的target。以下是部分可用的target选项:


  • desktop
  • windows
  • linux
  • android
  • android-emulator
  • ios
  • ios-simulator
  • sailfish
  • sailfish-emulator
  • rpi1
  • rpi2
  • rpi3
  qtdeploy会自动调用qtrcc和qtmoc来进行预编译,然后再使用go build来编译,所有的操作在这一条命令里就完成了,是不是很简单?下面我们看一个实例。
  这是一个使用QSplitter的例子,项目结构如下:
  

tree splitter  

  
splitter
/  
└── splitter.go
  

  项目目录中有一个splitter.go这是我们的示例程序,
  

package main  

  
import (
"os"  "github.com/therecipe/qt/core"
  "github.com/therecipe/qt/widgets"
  
)
  

  
func main() {
  widgets.NewQApplication(len(os.Args), os.Args)
  // left sider
  splitterLeft := widgets.NewQSplitter2(core.Qt__Horizontal, nil)
  textTop := widgets.NewQTextEdit2("左部文本", splitterLeft)
  splitterLeft.AddWidget(textTop)
  // right sider
  splitterRight := widgets.NewQSplitter2(core.Qt__Vertical, splitterLeft)
  textRight := widgets.NewQTextEdit2("右部文本", splitterRight)
  textbuttom := widgets.NewQTextEdit2("下部文本", splitterLeft)
  splitterRight.AddWidget(textRight)
  splitterRight.AddWidget(textbuttom)
  splitterLeft.SetWindowTitle("splitter")
  splitterLeft.Show()
  widgets.QApplication_Exec()
  
}
  

  具体代码我会在以后讲解,现在我们进行编译
  

qtdeploy build desktop splitter  

  编译会花较长的时间,我的开发环境是Linux,编译好后的项目结构如下:
  

tree splitter/ -L 3  
splitter
/  
├── deploy
  
│   └── linux
  
│       ├── lib
  
│       ├── plugins
  
│       ├── qml
  
│       ├── splitter
  
│       └── splitter.
sh  
├── linux
  
└── splitter.go
  

  可以看到我们的程序生成在了deploy目录里,因为我们的程序暂时没有使用Qt的扩展语法,所以没有qtmoc生成的中间代码。
  解释一下deploy/linux里的文件和目录,
  lib,plugins,qml:这些是程序运行需要的以来,以后打包的时候需要带上他们,否则程序找不到依赖无法正常运行。
  splitter:编译生成的我们的示例程序,名字就是我们项目目录的名称。
  splitter.sh:将前面的lib,plugins,qml添加到LD_LIBRARY_PATH,QT_PLUGIN_PATH=$dirname,QML_IMPORT_PATH等环境变量中,然后运行程序。
  也许你会觉得splitter.sh是多此一举,其实不然,首先编译玩后的程序在本地是可以不借助脚本直接运行的,因为它链接了本地的库和依赖,但是在开发机以外的环境中安装你的程序时,很可能目标机器上不存在对应的依赖文件(库,.qml文件等),这时候使用脚本来运行程序,它就会在被脚本添加进环境变量里的目录中寻找依赖文件,这样程序就可以正常运行了。
  所以,推荐通过[projectname].sh文件来运行程序。
  当然,这个脚本在打包deb的时候会有一点小小的麻烦,下一篇介绍项目打包的时候我会对它做一点小小的改造来解决这个问题。
  然后是运行程序:
  

cd splitter/deploy/linux  
bash splitter.
sh  

DSC0000.png

  ok,祝玩得愉快。
  qtdeploy的深入使用以及其他命令的介绍,请移步:https://github.com/therecipe/qt/wiki/Available-Tools
  如有疑问和建议,欢迎指出!



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598827-1-1.html 上篇帖子: linux下golang gRPC配置详解 下篇帖子: sync.WaitGroup golang并发调度器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表