在上一篇文章里,我们讲到了安装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命令就能完成项目的编译了。
编译
编译很简单,一条命令搞定:
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
当然,你的project需要在$GOPATH里:-p。
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是多此一举,其实不然,首先编译玩后的程序在本地是可以不借助脚本直接运行的,因为它链接了本地的库和依赖,但是在开发机以外的环境中安装你的程序时或者你的程序包含了某些资源文件的时候,很可能目标机器上不存在对应的库,也不会恰好存在你需要的资源文件,这时候使用脚本来运行程序,它就会在被脚本添加进环境变量里的目录中寻找依赖的库和资源,这样程序就可以正常运行了。
所以,推荐通过[projectname].sh文件来运行程序。
当然,这个脚本在打包deb/rpm的时候会有一点小小的麻烦,下一篇介绍项目打包的时候我会对它做一点小小的改造来解决这个问题:-p。
然后是运行程序:
cd splitter/deploy/linux bash splitter.sh
ok,祝玩得愉快。
qtdeploy的深入使用以及其他命令的介绍,请移步:https://github.com/therecipe/qt/wiki/Available-Tools#qtdeploy
如有疑问和建议,欢迎指出!