1. 程式人生 > >【golang-GUI開發】項目的編譯

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

腳本 中間 成了 語法 代碼 port recipe 時間 講解

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

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

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