【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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM