前言
目前找到幾個實作起來相對簡單的跨平台方案,但是各有優缺點
1.qt,優點:文檔豐富能完美的跨平台,相對執行效率高。
缺點:雜七雜八的東西太多,導緻開發平台環境太大,生成的可執行檔案過大,不能自由使用,靜态連結收費。
2.java 優點:文檔,開源産品多,能完全跨平台,并且生态非常好,完全免費。
缺點:依賴jvm。雖然jdk14後支援打包成本地應用程式輕按兩下運作,但是會把整個jvm打包進去,導緻程式過大。
3.gtk 優點:支援各種主流程式設計語言。相對執行效率高。
缺點:文檔少,生态相比之下不夠完整。
綜合考慮後發現go+gtk在當下環境簡直是絕配。
gtk寫跨平台UI,go寫跨平台業務。兩者都是既能跨平台,還能有想當高的執行效率。
GO語言本身是跨平台的,但是GO沒有GUI架構,是以想要跨平台需要借助GTK跨平台的窗體。對此GOTK就是go使用GTK的方式。
GOTK的github位址:https://github.com/gotk3/gotk3
首先搭建GOTK的開發環境,
基于window平台搭建開發環境
第一步:下載下傳安裝msys2
官方網址:http://www.msys2.org/
下載下傳安裝完畢後,修改下配置檔案,适應國内下載下傳環境
我安裝的是64位的,安裝目錄是D:\msys64
以下操作都是在D:\msys64下的目錄進行的。
是以在msys64下的/etc/pacman.d/目錄下會看到三個檔案
分别在mirrorlist.mingw32檔案中添加
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
添加完成後的樣子應該如下
##
## 32-bit Mingw-w64 repository mirrorlist
##
## Primary
## msys2.org
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
Server = https://sourceforge.net/projects/msys2/files/REPOS/MINGW/i686/
Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/i686/
Server = https://mirror.yandex.ru/mirrors/msys2/mingw/i686/
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
Server = http://mirror.bit.edu.cn/msys2/mingw/i686/
Server = https://mirror.selfnet.de/msys2/mingw/i686/
Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/mingw/i686/
Server = https://msys2.nyc3.digitaloceanspaces.com/mingw/i686/
Server = https://mirror.jmu.edu/pub/msys2/mingw/i686/
Server = https://ftp.cc.uoc.gr/mirrors/msys2/mingw/i686/
Server = https://ftp.acc.umu.se/mirror/msys2.org/mingw/i686/
Server = https://mirrors.piconets.webwerks.in/msys2-mirror/mingw/i686/
Server = https://quantum-mirror.hu/mirrors/pub/msys2/mingw/i686/
Server = https://mirrors.dotsrc.org/msys2/mingw/i686/
Server = https://mirror.ufro.cl/msys2/mingw/i686/
Server = https://mirror.clarkson.edu/msys2/mingw/i686/
Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/mingw/i686/
Server = https://download.nus.edu.sg/mirror/msys2/mingw/i686/
Server = https://ftp.osuosl.org/pub/msys2/mingw/i686/
然後在/etc/pacman.d/mirrorlist.mingw64中開頭添加
Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
在 /etc/pacman.d/mirrorlist.msys ,在開頭添加
Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
然後如下指令更新完,準備工作就完成了
pacman -Sy
第二步:安裝必要是軟體使用下面的指令,遇到的所有安裝選項都選全部安裝
安裝GCC,
pacman --noconfirm -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gtk3
安裝pkg-config
pacman --noconfirm -S mingw64/mingw-w64-x86_64-pkg-config
安裝gtk3,
pacman -S mingw-w64-x86_64-gtk3
安裝gtk2
pacman -S mingw-w64-x86_64-gtk2
安裝mingw
pacman -S mingw-w64-x86_64-toolchain base-devel
安裝mingw可能會因為環境的因素導緻失敗,如果失敗請确認gcc等環境是否安裝成功,如果還是失敗可以查找相關資料安裝mingw。一般安裝了gcc就不會失敗。
安裝gtk工具可選
安裝glade
pacman -S mingw-w64-x86_64-glade
安裝幫助文檔
pacman -S mingw-w64-x86_64-devhelp
然後配置環境變量,把以下兩個目錄加入到環境變量中
D:\msys64\usr\bin;
D:\msys64\mingw64\bin;
到此處環境安裝完成已經!
檢測環境是否安裝成功
pkg-config --cflags gtk+-2.0
make -v
第三步:運作demo
執行go指令
go get github.com/gotk3/gotk3/gtk
第一次執行這條指令耗時比較長,需要略微等待
如果失敗可能提示invalid flag in pkg-config --libs: -Wl,-luuid類似錯誤
invalid flag in pkg-config --libs: -Wl,-luuid
執行以下指令設定正确目錄即可
bash -c "sed -i -e 's/-Wl,-luuid/-luuid/g' D:/msys64/mingw64/lib/pkgconfig/gdk-3.0.pc"
在goland中建立項目結構如下:
初始化子產品
go mod init gotk
複制demo代碼運作
package main
import (
"github.com/gotk3/gotk3/gtk"
"log"
)
func main() {
// Initialize GTK without parsing any command line arguments.
gtk.Init(nil)
// Create a new toplevel window, set its title, and connect it to the
// "destroy" signal to exit the GTK main loop when it is destroyed.
win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
if err != nil {
log.Fatal("Unable to create window:", err)
}
win.SetTitle("Simple Example")
win.Connect("destroy", func() {
gtk.MainQuit()
})
// Create a new label widget to show in the window.
l, err := gtk.LabelNew("Hello, gotk3!")
if err != nil {
log.Fatal("Unable to create label:", err)
}
// Add the label to the window.
win.Add(l)
// Set the default window size.
win.SetDefaultSize(800, 600)
// Recursively show all widgets contained in this window.
win.ShowAll()
// Begin executing the GTK main loop. This blocks until
// gtk.MainQuit() is run.
gtk.Main()
}
最終運作效果如下
第四步:打包成可移植的程式
開發完成後,生成的exe并不能在沒有gtk的環境運作,是以需要将gtk相關的環境一起打包。
我的代碼在C:/go/src/gotk/下是以第一行設定的路徑是C:/go/src/gotk/
release=C:/go/src/gotk/
#建立執行路徑
mkdir $release/bin
#複制dll檔案
cp /mingw64/bin/*.dll $release/bin/
#建立目錄
mkdir -p $release/share/glib-2.0/schemas
mkdir $release/share/icons
mkdir -p $release/lib/gdk-pixbuf-2.0/2.10.0/loaders
#複制檔案
cp /mingw64/share/glib-2.0/schemas/* $release/share/glib-2.0/schemas
cp -r /mingw64/share/icons/* $release/share/icons
cp /mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.dll $release/lib/gdk-pixbuf-2.0/2.10.0/loaders
cp /mingw64/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache $release/lib/gdk-pixbuf-2.0/2.10.0
打包完未壓縮的目錄是100多MB明顯不是我們想要的大小,是以我我們要對這些進行精簡。
首先精簡生成的可執行程式
打包成exe的時候最精簡方式打包
go build -ldflags="-H windowsgui -s -w"
然後精簡不需要的gtk環境檔案
我在window下是這麼精簡的,
将全部檔案複制到一台沒有任何開發環境的window電腦。
然後輕按兩下運作,等程式完全運作起來,右鍵整個檔案夾點選删除,此時彈出XXX正在被占用,不能删除,選跳過。最終留下的就是必須要的dll檔案。
以demo為例。最終隻剩下26MB不到的檔案。
這個時候可執行的最小環境就已經定了。
最後一步進行檔案壓縮:
我使用360壓縮,壓縮成.7z檔案後,整個壓縮檔案也隻剩下8MB不到的大小。
一個8MB檔案的窗體程式,已經基本達到我的目标了。