在上一篇文章里,咱们讲到了安装therecipe/qt(http://www.javashuo.com/article/p-pegeefpb-he.html),如今咱们来说讲如何编译使用了therecipe/qt的项目。html
therecipe/qt如下简称qt,和Qt加以区分。linux
为何不直接使用go buildandroid
由于qt使用了moc技术(元对象编译器),对于一些Qt的扩展语法须要进行额外的处理,用C++写过Qt项目的读者应该知道不能直接用g++或者其余编译器去编译项目代码,而是经过qmake生成的Makefile进行构建,而在这个Makefile文件里就使用了moc程序来处理Q_OBJECT这样的扩展语法,处理完成后再交由C++编译器编译。golang也是一样的流程,只不过不用本身配置qmake,而是用一条qtdeploy命令就能完成项目的编译了。ios
固然使用go build也是可行的,若是你不须要qtdeploy生成的额外内容,使用以下命令便可:git
cd your_project
qtmoc # 使用moc处理Qt扩展语法
qtrcc # 若是使用了qrc机制须要使用此命令
go build -o project_name
以后等待一段时间,会在目录下生成可执行程序。这个程序是动态连接的,因此须要运行程序的目标机器安装有相应的依赖。github
由于目标环境可能不会安装有这些依赖,因此这时候咱们就能够用qtdeploy解决问题。golang
编译windows
编译很简单,一条命令搞定:bash
qtdeploy build [target] [path/to/your/project]
target是指定的目标平台,编译完成后的程序将能够在target指定的平台上运行。ide
若是也能够将target设为desktop,qtdeploy将会根据本地环境选择相对应的target。如下是部分可用的target选项:
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
若有疑问和建议,欢迎指出!