在上一篇文章裡,我們講到了安裝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 splittersplitter/└── splitter.go
項目目錄中有一個splitter.go這是我們的樣本程式,
package mainimport ( "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/linuxbash splitter.sh
ok,祝玩得愉快。
qtdeploy的深入使用以及其他命令的介紹,請移步:https://github.com/therecipe/qt/wiki/Available-Tools#qtdeploy
如有疑問和建議,歡迎指出!