Go语言编译时为exe添加图标和属性信息的方法

news/2024/10/5 15:35:24/文章来源:https://www.cnblogs.com/biltong/p/18269684

在使用Go语言开发应用程序时,有个非常方便的地方就是编译得到的可执行文件可以不依赖任何动态链接库、并且不需要任何运行环境即可运行,本文给大家介绍Go编译时为exe添加图标和属性信息的方法,需要的朋友可以参考下

    1,安装go-winres命令2,创建配置模板3,修改配置(1) 图标指定(2) 软件清单(3) 元数据信息(4) 简易winres.json模板4,编译资源5,编译Go程序

在使用Go语言开发应用程序时,有个非常方便的地方就是编译得到的可执行文件可以不依赖任何动态链接库、并且不需要任何运行环境即可运行,这一点Java就没那么方便了。

不过在Windows上编译得到的exe文件,默认是不带图标和任何属性信息的,那么怎么才能让我们编译得到的可执行文件带上图标和属性信息呢?

事实上,借助go-winres这款命令行工具即可很方便地实现。

1,安装go-winres命令

执行下列命令即可安装go-winres命令到电脑中:

go install github.com/tc-hib/go-winres@latest

2,创建配置模板

我们首先需要一个配置文件来指定我们的图标文件和属性信息,然后将它们编译得到资源文件,最后将资源文件和Go源代码一起编译即可得到带有图标的可执行文件了!

我们可以先生成一个配置模板,然后进行修改即可,执行下列命令:

go-winres init

然后在当前目录下,你会发现多了个winres目录,其中winres.json就是配置文件,而两个png文件则是它自带的图标文件:

3,修改配置

使用文本编辑器打开winres.json文件,其中有一些初始内容:

其中的大致结构我们不需要修改,基本上就是修改指定其中部分字段值即可。

下面,我们来单独看一下每个部分。

(1) 图标指定

我们来看看图标部分,声明在json文件中的RT_GROUP_ICON属性中:

"RT_GROUP_ICON": {"APP": {"0000": ["icon.png","icon16.png"]}
}

上述APP表示一组图标,其中还有一个0000,表示语言,不过这两个属性名称都不需要怎么动,重点是看0000这个属性,它是一个数组,而很显然数组中记录着一组图标,在其中可以指定不同分辨率的图标。在这里指定的图标就会被应用到最终编译的可执行文件上去。

图标文件可以就是png文件,将它和winres.json放在同一目录下,然后在这个0000数组中指定图标文件名即可。

假设我现在需要自定义图标,并且只需要一个文件,那么我可以先删除里面自带的两个png文件,然后把我的图标放在和winres.json同级目录下:

然后修改图标部分配置如下:

"RT_GROUP_ICON": {"APP": {"0000": ["my-icon.png"]}
}

这样,图标就指定完成了!

需要注意的是,图片文件尺寸不能大于256 x 256!

(2) 软件清单

软件清单部分声明在RT_MANIFEST属性中:

"RT_MANIFEST": {"#1": {"0409": {"identity": {"name": "","version": ""},"description": "","minimum-os": "win7","execution-level": "as invoker","ui-access": false,"auto-elevate": false,"dpi-awareness": "system","disable-theming": false,"disable-window-filtering": false,"high-resolution-scrolling-aware": false,"ultra-high-resolution-scrolling-aware": false,"long-path-aware": false,"printer-driver-isolation": false,"gdi-scaling": false,"segment-heap": false,"use-common-controls-v6": false}}
}

上述并非所有属性都需要填写和修改,这里将重要的部分讲解一下:

    description 文件的描述信息minimum-os 最低要求操作系统,可以是以下值:"vista""win7""win8""win8.1""win10"execution-level 应用程序所需的权限,可以是:"as invoker" 不需要任何权限"highest" 使用当前用户的可用最高权限"administrator" 强制要求管理员权限才能运行

对于identify属性,普通应用程序建议留空即可,也可以将其删除。

(3) 元数据信息

这部分定义在RT_VERSION属性中:

"RT_VERSION": {"#1": {"0000": {"fixed": {"file_version": "0.0.0.0","product_version": "0.0.0.0"},"info": {"0409": {"Comments": "","CompanyName": "","FileDescription": "","FileVersion": "","InternalName": "","LegalCopyright": "","LegalTrademarks": "","OriginalFilename": "","PrivateBuild": "","ProductName": "","ProductVersion": "","SpecialBuild": ""}}}}
}

这里也并非所有属性都需要填写和修改,这里将重要的部分讲解一下:

    fixed 属性中的两个属性,主要是声明文件版本和程序版本,按照x.y.z.w的格式自己填写即可info 主要是属性信息,其中0409是英语的语言代码,表示在英文环境下显示其中的属性,在info中可以定义多个语言环境下的属性信息,具体大家可以查看官方项目示例,在其中:CompanyName 公司名称FileDescription 文件描述FileVersion 文件版本ProductVersion 程序版本LegalCopyright 版权信息OriginalFilename 原始文件名ProductName 程序名称

(4) 简易winres.json模板

可见上述有许多属性是我们大多数时候不需要进行设定的,可以删除,因此这里我提供一个模板,大家可以复制作为自己的winres.json文件使用:

{"RT_GROUP_ICON": {"APP": {"0000": ["my-icon.png"]}},"RT_MANIFEST": {"#1": {"2052": {"description": "我的Go示例程序","minimum-os": "win7","execution-level": "highest","ui-access": false,"auto-elevate": false,"dpi-awareness": "system","disable-theming": false,"disable-window-filtering": false,"high-resolution-scrolling-aware": false,"ultra-high-resolution-scrolling-aware": false,"long-path-aware": false,"printer-driver-isolation": false,"gdi-scaling": false,"segment-heap": false,"use-common-controls-v6": false}}},"RT_VERSION": {"#1": {"0000": {"fixed": {"file_version": "1.0.0.0"},"info": {"2052": {"CompanyName": "公司名称","FileDescription": "我的Golang示例程序","LegalCopyright": "© 版权","OriginalFilename": "demo.exe","ProductName": "Go示例","ProductVersion": "1.0.0.0"}}}}}
}

大家修改其中信息为自己的即可。

4,编译资源

在winres文件夹所在目录下执行命令

go-winres make

此时你会发现多了这几个syso文件,这就是编译得到的资源:

需要注意的是,上述命令的运行路径是在winres文件夹所在目录下,而不是winres文件夹里面。

当然,你也可以使用--in参数指定json文件位置,如果你的运行路径不在winres文件夹的所在目录下的话:

# 指定json配置文件在上一级目录的res目录中
go-winres make --in "../res/winres.json"

还可以使用--out参数指定输出的资源文件位置,具体大家可以通过命令go-winres make --help查看帮助。

5,编译Go程序

首先确保上述编译得到的两个syso资源文件和Go语言模块配置go.mod在同级目录下:

然后像平时一样,在go.mod所在目录下执行构建命令即可:

go build -ldflags "-w -s"

这样,我们得到的可执行文件就有图标和属性信息了!

上述命令中,ldflags参数指定的是去除调试和符号信息以减小构建产物文件大小,这个参数可以省略。

可见我们编译得到的资源文件都有着类似_windows_amd64这样的后缀,这个后缀是用于go build命令链接资源时,根据架构判断链接哪个资源用的,例如当我们编译64位程序时,go build就会自动寻找名为xxx_windows_amd64.syso的资源文件进行链接,同样地如果是编译为32位程序,则是寻找名为xxx_windows_386.syso的资源文件,因此syso资源文件的文件名必须是xxx_windows_amd64.syso这样的形式,不可以修改其后缀。

与此同时,在进行go build时,go.mod文件必须要和syso文件在同一目录下,如果没有go.mod文件,那主程序文件(被编译的)就需要和syso文件在同一目录下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/731726.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[AFCTF 2021]google authenticator google验证生成 redis提权

今天学习几个知识点。进入页面发现登录框,扫目录没发现有用东西,弱口令没用,那就是sql注入,试试看。万能登录试试发现回显有东西。进入去看看。发现了个这个东西,去搜搜看。找到可利用的东西,且给出了用法,但是我们不知道secret,去数据库里看看。报错注入发现users表,…

配置h5py、netCDF4库的方法:Anaconda环境

本文介绍基于Anaconda环境,下载并安装Python中h5py与netCDF4这两个模块的方法~本文介绍基于Anaconda环境,下载并安装Python中h5py与netCDF4这两个模块的方法。在Python语言中,h5py与netCDF4这两个模块是与遥感图像处理、地学分析等GIS操作与算法等研究息息相关的模块,应用较…

Aloha Mobile 移动机器人机器学习套件

Mobile Robotic Machine Learning Kit 移动机器人机器学习套件Upgraded Grippers, Haptics, and Joint 升级的夹持器、力反馈和关节 New all-metal gripper linkages for long-term reliabilityCompression-proof bearings with no risk of overtightening or wearing out …

QDU-OJ python升级后不能正确编译的问题

报错情况修改编译选项 docker exec -it oj-backend shpython3 manage.py shellfrom options.options import * print(SysOptions.languages)这是系统使用的语言和编译器信息和编译选项,是 judge/languages.py 的拷贝(参见judgerServer),如果只修改 py 文件,是不会生效的。需…

slab分配器(深入理解linux内核)

引子 前文介绍了使用为了解决外部碎片,使用Buddy System进行连续内存页面的分配,但对于使用内存的程序而言,Buddy System分配的内存粒度过大,假如我们需要动态申请一个内核结构体(占 20 字节),若仍然分配一页内存,这将严重浪费内存。那么该如何分配呢?slab 分配器专为…

由本签名控制的文档修订版次尚未被更改,但在其后,文档已被更改

原文链接:https://blog.csdn.net/weixin_45303938/article/details/108007791 签章后修改文档如果把一个有签过名的PDF文档进行修改,再验证时可能会有以上的提示:“由本签名控制的文档修订版次尚未被更改,但在其后,文档已被更改”。出现这种情况的原因来自于PDF文档独特的…

yolov5-v7.0 目录结构

一、一级目录下各文件功能模型架构(位于 /models): 如果希望改变YOLOv5的架构,需要修改通常位于 models 目录中的模型定义文件。这可能包括改变网络的深度和宽度,更改层类型或添加新层。 训练数据(位于 /data): 为了提高模型在特定任务上的表现,需要更新位于 data 目…

从0开始搭建seldom-platform平台

一、前言 seldom-platform平台虫师已经出挺久了,但是之前因为没有linux环境,导致一直无法尝试搭建,这次自己创建个虚拟机linux环境,从0开始搭建,因为虫师的文档有些没咋搞懂,边参考边自己找资料。 二、linux环境搭建 1、下载VMware虚拟机,现在免费了,直接下载即可免费试…

【YashanDB知识库】YAS-00103 no free block in dictionary cache

【问题分类】功能使用 【关键字】YAS-00103,no free block in dictionary cache 【问题描述】执行union all 太多子查询导致报错,例子如下:【问题原因分析】选择增大DICTIONARY_CACHE_SIZE 或 SHARE_POOL_SIZE 或 两者都增大 【解决/规避方法】优先考虑增大SHARE_POOL_SIZE …

记录--vue3中使用Swiper组件

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 一,安装npm i swiper二,使用 swiper/vue 导出 2 个组件:Swiper 和 SwiperSlide<template><swiper:slides-per-view="3":space-between="50"@swiper="onSwiper"@slideChange=&…

2024.6.26 CTF MISC任务清单

题目目录[HBNIS2018]caesar[SUCTF2018]single dog [HBNIS2018]caesar BUUCTF在线评测 (buuoj.cn) 打卡一看,是个密文 根据题目英文“caesar” 可知,是凯撒密码 于是我们上链接!凯撒密码在线加密解密 - 千千秀字 (qqxiuzi.cn) 即可得到 flag [SUCTF2018]single dog打开一看,…

IDEA创建Java项目的初始配置

第一步,新建项目打开settings第二步,设置Java Compiler第三步,设置项目文件和编码第四步,设置Maven仓库位置