天天看點

Go使用gotk開發跨平台桌面程式,打包壓縮後僅8MB

作者:StrangenessWind

前言

目前找到幾個實作起來相對簡單的跨平台方案,但是各有優缺點

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使用gotk開發跨平台桌面程式,打包壓縮後僅8MB

初始化子產品

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()
}
           

最終運作效果如下

Go使用gotk開發跨平台桌面程式,打包壓縮後僅8MB

第四步:打包成可移植的程式

開發完成後,生成的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檔案的窗體程式,已經基本達到我的目标了。

繼續閱讀