Fork me on GitHub

【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

 

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

posted @ 2018-07-12 16:48  apocelipes  阅读(5361)  评论(6编辑  收藏  举报