【golang-GUI开发】项目的编译
在上一篇文章里,我们讲到了安装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开发】项目的编译的更多相关文章
- 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)
作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- VS Code Java 2 月更新!教育特别版:单元测试、GUI开发支持、Gradle项目创建、以及更多!
新春快乐!欢迎来到 Visual Studio Code Java 的 2 月更新,这个月我们给大家带来了一期教育特别版.每年的年初是许多学校开学的时间,为了给学生和教师提供在 Visual Stud ...
- Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目
Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...
- .NET 开源开发项目【翻译】
原文地址 本文列出了 .NET 开源开发项目(open source developer projects).意在包括对开发过程的所有方面有所帮组的项目.对于消费项目(consumer project ...
- golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的
golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...
- 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析
原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...
- 基于gin的golang web开发:docker
Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...
- squareline搭档OneOS图形组件之可视化GUI开发
LVGL+OneOS! LVGL,一款很火的GUI开发库,一个高度可裁剪.低资源占用.界面美观且易用的嵌入式系统图形库.本身并不依赖特定的硬件平台,任何满足LVGL硬件配置要求的微控制器均可运行LVG ...
- Eclipse/Myeclipse 开发项目技巧
Eclipse/Myeclipse 开发项目 编程的本质: 把现实生活中的业务逻辑用代码实现. eclipse 是一个开放源代码.基于Java的可扩展开发平台. (最初主要用来Java语言开发,但目前 ...
随机推荐
- SFTP文件服务器的搭建
由于公司项目的需要,需要自己搭建一个SFTP文件服务器,来实现不同IP服务器之间文件的传输: 应用的场景:由于需要缓解服务器的压力,需要对服务进分离,分别放置在不同IP服务器上: 首先提供一个SFTP ...
- .Net QQ互联教程
qq互联只需要备案即可申请,申请成功后可以到qq互联官网查看教程,本站开始想使用js的教程但是由于本站需要绑定本站的账号用js教程无法完成,所以使用原始的oauth2.0来完成. 申请qq互联接口 q ...
- 【ProtoBuffer】windows上安装ProtoBuffer3.1.0 (附已编译资源)
------- 17.9.17更新 --- 以下这些方法都是扯淡,对我的机器不适用,我后来花了最后成功安装并亲测可用的方法不是靠vs编过的,vs生成的库引入后函数全部报undefine refere ...
- Python的基本数据类型
数据类型常用函数 type(a)-得到变量a的数据类型 isinstance(a,str)-判断a是否是字符串类型 Python中有五个标准数据类型 数字Number 字符串String 数组List ...
- git 创建项目
Command line instructions Git global setup git config --global user.name "quliangliang" gi ...
- docker基础内容讲解
一.初识docker 1.1 LXC介绍 LXC为LinuX Container的简写.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提 ...
- kafka中zookeeper的操作
bin/zookeeper-shell.sh localhost:2181 <<< "get /brokers/ids/4" ./zkCli.sh -server ...
- 最强大的跨语言调用生成工具:Swig 快速实用教程
swig是一个生成其他高级语言调用c和C++代码的工具,比如,大家都知道java的jni,可能没写过,因为非常麻烦,swig可以帮助生成这样的代码,编译生成的代码后,它会生成java类和c代码文件.分 ...
- Openvswitch手册(3): sFlow, netFlow
这一节,我们重点看sFlow 采样流sFlow(Sampled Flow)是一种基于报文采样的网络流量监控技术,主要用于对网络流量进行统计分析. sFlow系统包含一个嵌入在设备中的sFlow Age ...
- 水晶报表使用IEnumerable<T>数据源
这篇我们学习水晶报表,报表呈现的数据源是IEnumerable<T>.比如下面的数据: using System; using System.Collections.Generic; us ...