程序员开发实例大全宝库

网站首页 > 编程文章 正文

Go使用gotk开发跨平台桌面程序,打包压缩后仅8MB

zazugpt 2025-05-16 17:56:08 编程文章 3 ℃ 0 评论


前言
目前找到几个实现起来相对简单的跨平台方案,但是各有优缺点
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文件的窗体程序,已经基本达到我的目标了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表