Go利用windres.exe和.rc文件在Windows下生成的程序带有版本、版权、产品名称、图标等属性信息

用Go在Windows下写了一个.exe的程序,这个程序默认是不带版本,版权,产品名称以及图标的,因此,这些东西我们要自己去生成。

Go对于程序版本这方面已经有了开源的包,见GitHub - https://github.com/josephspurrier/goversioninfo

你可以自己在Go的代码中引入这个包,并且在生成.syso文件,这样子是可以的。

既然提到了.syso,那么可以推断出,要使得用Go编写的Windows程序具有这些属性信息,.syso是必须的,至于怎么生成.syso,那就有很多方法了。

这里只介绍用windres.exe.rc资源文件还有.manifest来生成这些属性。

windres.exeWindows下是不带的,我用Everything在我的电脑上搜到的路径如下:

在这里插入图片描述

版本的生成

标准的做法是这样子的,a.b.c.d,前三位是固定不动的,例如1.0.1,这作为一个大版本,如果修改,需要人手动修改;

后面这一位就有讲究了,由于开发程序时我们都会有版本控制工具,而Git也是用得最多的,因此这最后一位要和Git版本控制挂钩。

而版本号有两个,产品版本号和文件版本号,表现形式又要分两种,一种是直接作为程序的标识,一种是给人看的(这个呈现在属性页上)。给人看的可以随便写,程序的标识可不能随便弄;

而文件版本号修改一次增加一次,产品版本号发布一次增加一次,由于我的程序是.exe,因此这两个是一样的。

因此我们用两个Git的两个命令来生成版本号:

  • git rev-list --count HEAD,获取该分支提交(修改)了多少次
  • git rev-parse --short HEAD,获取该分支最后一次提交的短哈希号

提交了多少次可以作为最后一位版本号,短哈希号可以附加到最后一位版本号后面,便于我们追踪问题。

因此我们需要一些脚本和一些文件来完成这些工作。

// version_template.h

#pragma once
#define VER_MAJOR 1
#define VER_MINOR 0
#define VER_PATCH 1

这个是前三位的版本号。

// make_version.bat

@ECHO OFF
cd /d %1
if exist %2 del /q %2
for /f "delims=" %%i in ('git rev-list --count HEAD') do (set REVISION=%%i)
for /f "delims=" %%i in ('git rev-parse --short HEAD') do (set REVISION_HASH=%%i)

if "%REVISION%" == "" (
	set REVISION=0
) 

(echo #define VER_REVISION %REVISION%  && echo #define VER_REVISION_HASH %REVISION_HASH%) > %2

执行这个脚本make_version.bat ./ ./version.h可以生成最后一位版本号和短哈希值。如下:

// version.h

#define VER_REVISION 33  
#define VER_REVISION_HASH a883258

注意version.h是通过脚本生成的,不要添加到版本库中,这属于无用的文件(因为可以生成啊)。

举个例子,最后的版本号应该是这个样子的:1.0.1.33以及1.0.1.33.a883258

.manifest

这个东西我对它的了解只限于添加启动权限,因此这里也用它添加启动时需要管理员权限。

// FlushHip.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

.rc

这个是重点,通过.rc文件把版权,版本,名称这些属性描述信息写进去。下面就提供一个模板。大家可以对应着地方进行修改

// FlushHip.rc

#define RT_MANIFEST 24

#include "version.h"
#include "version_template.h"

#define MAKEVER_S(a,b,c,d) a,b,c,d
#define MAKEVER(a,b,c,d,e) a.b.c.d.e
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

1 VERSIONINFO
PRODUCTVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)
FILEVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)

BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904B0"
        BEGIN
			VALUE "CompanyName", "blog.csdn.net/FlushHip"
			VALUE "FileDescription", "FlushHip"
			VALUE "FileVersion", TOSTRING(MAKEVER(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION, VER_REVISION_HASH))
			VALUE "InternalName", "FlushHip"
			VALUE "LegalCopyright", "Copyright (C) 2018. FlushHip. All Rights Reserved."
			VALUE "OriginalFilename", "FlushHip.exe"
			VALUE "ProductName", "FlushHip"
			VALUE "ProductVersion", TOSTRING(MAKEVER(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION, VER_REVISION_HASH))
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
            VALUE "Translation", 0x0409, 0x04B0
    END
END

1 ICON "FlushHip.ico"

1 RT_MANIFEST "FlushHip.manifest"
1 VERSIONINFO
PRODUCTVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)
FILEVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)

上面这三行代码是程序的表示,一定要不能错;

下面的描述信息可以随意,在属性页中呈现的就是这些东西;

1 RT_MANIFEST "FlushHip.manifest"

这个是加权限。

图标

1 ICON "FlushHip.ico"

只能用.ico格式的图标

生成.syso文件

我们写的上面的所有东西,最终的目的都是生成.syso文件,因此可以这么做:

cd "%~dp0"
call make_version.bat ./ version.h

cd "%~dp0"
windres.exe -i FlushHip.rc -o FlushHip.syso

call go build -ldflags "-H windowsgui"

写的是后台程序,不希望弹出控制台,因此加上-ldflags "-H windowsgui"

这样子就可以在项目FlushHip下生成一个FlushHip.exe的文件,我们打开属性页看看

在这里插入图片描述

在这里插入图片描述

成功。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
使用方法,解压到本地目录,配置path,即可在dos下使用linux命令。 windows下能直接执行的linux命令,基本包括日常所有,如:[.exe grolbp.exe regtool.exe a2p.exe grolj4.exe rm.exe a2p5.10.0.exe grops.exe rmdir.exe addftinfo.exe grotty.exe rmt.exe addr2line.exe gzip.exe run.exe alternatives.exe head.exe runcon.exe ar.exe hostid.exe rxvt.exe arch.exe hostname.exe scp.exe as.exe hpftodit.exe sdiff.exe ascii.exe i686-pc-cygwin-gcc-3.4.4.exe sed.exe ash.exe i686-pc-cygwin-gcc-3.exe semstat.exe awk.exe i686-pc-cygwin-gcc.exe semtool.exe banner.exe id.exe seq.exe base64.exe indxbib.exe setfacl.exe basename.exe info.exe setmetamode.exe bash.exe infokey.exe sftp-server.exe bigram.exe install-info.exe sftp.exe bunzip2.exe install.exe sh.exe bzcat.exe ipcrm.exe sha1sum.exe bzip2.exe ipcs.exe sha224sum.exe bzip2recover.exe join.exe sha256sum.exe c++filt.exe kill.exe sha384sum.exe cat.exe ld.exe sha512sum.exe cc-3.exe less.exe shmtool.exe cc.exe lessecho.exe shred.exe chcon.exe lesskey.exe shuf.exe chgrp.exe link.exe size.exe chmod.exe lkbib.exe sleep.exe chown.exe ln.exe soelim.exe chroot.exe locate.exe sort.exe cksum.exe login.exe split.exe cmp.exe logname.exe ssh-add.exe code.exe lookbib.exe ssh-agent.exe comm.exe lpr.exe ssh-keygen.exe conv.exe ls.exe ssh-keyscan.exe cp.exe make.exe ssh-keysign.exe cpp-3.exe makeinfo.exe ssh.exe cpp.exe man.exe sshd.exe crypt.exe man2html.exe ssp.exe csplit.exe manpath.exe stat.exe cut.exe md5sum.exe strace.exe cygcheck.exe mkdir.exe strings.exe cygpath.exe mkfifo.exe strip.exe cygrunsrv.exe mkgroup.exe stty.exe cygserver.exe mknod.exe su.exe cygstart.exe mkpasswd.exe sum.exe d2u.exe mkshortcut.exe svn.exe date.exe mktemp.exe svnadmin.exe dd.exe mount.exe svndumpfilter.exe df.exe msgtool.exe svnlook.exe diff.exe mv.exe svnsync.exe diff3.exe nc.exe svnversion.exe dir.exe ngettext.exe sync.exe dircolors.exe nice.exe tac.exe dirname.exe nl.exe tail.exe dlltool.exe nm.exe tar.exe dllwrap.exe nohup.exe tbl.exe dos2unix.exe objcopy.exe tee.exe du.exe objdump.exe test.exe dump.exe od.exe texindex.exe dumper.exe oldfind.exe tfmtodit.exe echo.exe openssl.exe touch.exe editrights.exe passwd.exe tr.exe egrep.exe paste.exe troff.exe env.exe pathchk.exe true.exe envsubst.exe peflags.exe tsort.exe eqn.exe perl.exe tty.exe expand.exe perl5.10.0.exe u2d.exe expr.exe pfbtops.exe umount.exe factor.exe pgawk-3.1.6.exe uname.exe false.exe pgawk.exe unexpand.exe fgrep.exe pic.exe uniq.exe find.exe pinky.exe unix2dos.exe fmt.exe post-grohtml.exe unlink.exe fold.exe pr.exe unprotoize-3.exe frcode.exe pre-grohtml.exe unprotoize.exe gawk-3.1.6.exe printenv.exe users.exe gawk.exe printf.exe vdir.exe gcc-3.exe protoize-3.exe vim.exe gcc.exe protoize.exe wc.exe gcov-3.exe ps.exe which.exe gcov.exe ptx.exe who.exe getclip.exe putclip.exe whoami.exe getfacl.exe pwd.exe windmc.exe gettext.exe ranlib.exe windres.exe gkill.exe readelf.exe xargs.exe gprof.exe readlink.exe xmlwf.exe grep.exe readshortcut.exe xxd.exe grn.exe realpath.exe yes.exe grodvi.exe rebase.exe zdump.exe groff.exe refer.exe zic.exe
引用\[1\]:collect2.exe: error: ld returned 1 exit status mingw32-make\[2\]: *** \[modules\core\CMakeFiles\opencv_core.dir\build.make:1800: bin/libopencv_core451.dll\] Error 1 mingw32-make\[1\]: *** \[CMakeFiles\Makefile2:1794: modules/core/CMakeFiles/opencv_core.dir/all\] Error 2 mingw32-make: *** \[Makefile:165: all\] Error 2 。 引用\[2\]:mingw32-make\[2\]: *** \[modules\python2\CMakeFiles\opencv_python2.dir\build.make:76: modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.obj\] Error 1 mingw32-make\[1\]: *** \[CMakeFiles\Makefile2:3365: modules/python2/CMakeFiles/opencv_python2.dir/all\] Error 2 mingw32-make: *** \[Makefile:165: all\] Error 2 。 引用\[3\]:问题:gcc: error: long: No such file or directory** C:\PROGRA~2\Dev-Cpp\MinGW64\bin\windres.exe: preprocessing failed. modules\core\CMakeFiles\opencv_core.dir\build.make:1420: recipe for target ‘modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj’ failed mingw32-make\[2\]: *** \[modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj\] Error 1 mingw32-make\[2\]: *** Waiting for unfinished jobs… CMakeFiles\Makefile2:1603: recipe for target ‘modules/core/CMakeFiles/opencv_core.dir/all’ failed mingw32-make\[1\]: *** \[modules/core/CMakeFiles/opencv_core.dir/all\] Error 2 。 问题:qt中Opencv4 cmake时mingw32-make: *** \[Makefile:165: all\] Error 2 回答: 这些错误信息表明在使用Qt中的Opencv4进行cmake时出现了问题。具体来说,出现了ld returned 1 exit status、Error 1、Error 2等错误。这些错误通常是由于编译器无法找到所需的文件或目录导致的。可能的原因包括缺少依赖项、路径设置错误或编译器配置问题。为了解决这些错误,您可以尝试以下几个步骤: 1. 确保您已正确安装了Opencv4和Qt,并且它们的路径已正确设置。 2. 检查您的编译器配置是否正确,包括编译器版本和路径设置。 3. 检查您的项目配置文件是否正确,包括CMakeLists.txt文件中的路径和依赖项设置。 4. 确保您的系统中已安装所需的依赖项,并且它们的路径正确。 5. 尝试清理并重新构建您的项目,以确保所有文件和依赖项都正确配置。 如果您仍然遇到问题,建议您查阅Opencv4和Qt的官方文档,以获取更详细的指导和解决方案。 #### 引用[.reference_title] - *1* *2* [Qt5.14+Opencv4.1+CMake3.22配置](https://blog.csdn.net/qq_45792470/article/details/125774264)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [OpenCV使用CMake和MinGW-w64的编译安装](https://blog.csdn.net/qq_61604164/article/details/121731875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlushHip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值