【golang-GUI開發】項目的編譯

在上一篇文章裏,咱們講到了安裝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選項:

  • 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

 

若有疑問和建議,歡迎指出!

相關文章
相關標籤/搜索