在上一篇文章里,我们讲到了安装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

ok,祝玩得愉快。

qtdeploy的深入使用以及其他命令的介绍,请移步:https://github.com/therecipe/qt/wiki/Available-Tools

如有疑问和建议,欢迎指出!

【golang-GUI开发】项目的编译的更多相关文章

  1. 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)

    作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  2. VS Code Java 2 月更新!教育特别版:单元测试、GUI开发支持、Gradle项目创建、以及更多!

    新春快乐!欢迎来到 Visual Studio Code Java 的 2 月更新,这个月我们给大家带来了一期教育特别版.每年的年初是许多学校开学的时间,为了给学生和教师提供在 Visual Stud ...

  3. Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目

    Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...

  4. .NET 开源开发项目【翻译】

    原文地址 本文列出了 .NET 开源开发项目(open source developer projects).意在包括对开发过程的所有方面有所帮组的项目.对于消费项目(consumer project ...

  5. golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的

    golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...

  6. 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...

  7. 基于gin的golang web开发:docker

    Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...

  8. squareline搭档OneOS图形组件之可视化GUI开发

    LVGL+OneOS! LVGL,一款很火的GUI开发库,一个高度可裁剪.低资源占用.界面美观且易用的嵌入式系统图形库.本身并不依赖特定的硬件平台,任何满足LVGL硬件配置要求的微控制器均可运行LVG ...

  9. Eclipse/Myeclipse 开发项目技巧

    Eclipse/Myeclipse 开发项目 编程的本质: 把现实生活中的业务逻辑用代码实现. eclipse 是一个开放源代码.基于Java的可扩展开发平台. (最初主要用来Java语言开发,但目前 ...

随机推荐

  1. centos7安装mariadb

    ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 1.官方um安装mariadb 1).准备官方yum [mariadb ...

  2. JS模块化工具require.js教程(二):基本知识

    前一篇:JS模块化工具我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等 基本API require会定义三个变量:define,r ...

  3. Solr Cloud

    bin/solr start -cloud -s example/cloud/node1/solr -p 8983 -z node13:2181,node14:2181,node15:2181/usr ...

  4. Android中实现gif动画

    一.需求 Android本身没有提供直接显示gif动画的相关控件,因此需要自定义GifImageView类来实现gif的播放,主要是使用的Movie类来解决的. 二.自定义GifImageView p ...

  5. CDN随笔

    CDN的理解:(1)CDN (内容分发网络)加速用户获取数据的 系统(2)部署在离用户最近的网络节点上(3)命中CDN 不需要访问后端服务器(4)互联网公司自己搭建或租用

  6. jackson 用法总结

    1.序列化与反序列化封装 private static final Logger logger = LoggerFactory.getLogger(JsonUtil.class); /** * Obj ...

  7. VS2013和NuGet

    1.前言 有时候在使用VS2013时需要用到第三方的dll,这时候NuGet就是一个很方便的工具.但是这个小东东也是和VS不同的版本相关的,最开始不知道,乱安装一气,最后就是很多情况下不能用.这两天在 ...

  8. Javascript高级编程学习笔记(44)—— 动态样式

    动态样式 动态样式和昨天的动态脚本一样,都是一种动态引入外部样式(脚本的方式) 由于样式是由 link 元素引入的,所以动态样式自然也就是动态生成link元素插入文档的方式 不过和动态脚本不同的是,动 ...

  9. Java内存溢出异常(下)

    此篇是上一篇文章Java内存溢出异常(上)的续篇,没有看过的同学,可以先看一下上篇.本篇文章将介绍剩余的两个溢出异常:方法区和运行时常量池溢出. 方法区和运行时常量池溢出 这部分为什么会放在一起呢?在 ...

  10. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...