首页 > 系统相关 >在Linux中快速编译出带图标的windows程序

在Linux中快速编译出带图标的windows程序

时间:2023-11-21 15:03:29浏览次数:40  
标签:文件 编译 windows 程序 rsrc Windows Linux 图标

1. 摘要

以前做的一个项目有个需求, 需要在Linux系统上的服务后端根据前端配置动态编译出能在Windows平台运行的程序, 并且能支持程序带图标, 虽然使用Go语言能够方便的编译跨平台运行的代码, 但编译带资源图标的Windows可执行程序还未尝试过, 本篇文章对这部分内容做一个过程记录。

2. 准备工作

如果要单独完成这项任务, 需要准备以下几样"配菜":

1.rsrc程序, 开源项目, 地址: https://github.com/akavel/rsrc

2.一份模拟在Windows平台运行的源码, 当被自动编译后, 能看到运行效果。

3.一份图标文件, 文件后缀为.ico。

4.一份模拟服务后端功能的程序, 该程序负责编译出最终带图标的Windows程序。

下面将依次介绍这四样"配菜"的调制方法:


2.1 rsrc程序

rsrc程序是一个开源专门负责将ico资源文件写入Windows PE可执行程序的工具, 该工具使用Go语言开发, 能够支持将rsrc代码编译成支持不同平台的可执行程序, 支持的系统包括: Darwin、Linux(amd64)、Windows(386)、Windows(amd64)。

rsrc程序的参数在实际使用过程中主要有三个:

1.-arch 该参数将指定嵌入资源后的程序运行的CPU架构, 为了向下同时兼容32位和64位系统, 这里一般设置的参数为:"-arch 386"。

2.-ico 该参数执行传入的图标文件保存的全路径。

3.-o 该参数是一个输出参数, 将输出一个.res或者.syso的资源文件, 如果不指定资源文件的名字, rsrc将默认输出一个名为:rsrc_windows_{arch}.syso的文件, 在我们实际应用中, 将输出格式为: .syso的文件。


2.2 模拟Windows程序

模拟Windows程序, 这里为了能看到运行的实际效果, 将在Go代码中嵌入Windows的对话框元素, 双击执行后将弹出一个对话框, 表示程序运行成功。以下是模拟Windows程序的Go源码:

package main

import (
    "syscall"
    "unsafe"
)

var (
    user32, _     = syscall.LoadLibrary("user32.dll")
    messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")
)

func IntPtr(n int) uintptr {
    return uintptr(n)
}

func StrPtr(s string) uintptr {
    return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}

func ShowMessage(title, text string) {
    user32 := syscall.NewLazyDLL("user32.dll")
    MessageBoxW := user32.NewProc("MessageBoxW")
    MessageBoxW.Call(IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}

func main() {
    defer syscall.FreeLibrary(user32)
    ShowMessage("成功消息!", "Hello!")
}

这段代码运行成功后, 将弹出一个成功的对话框。

2.3 图标文件

图标文件准备标准的ico格式文件即可, 以下是我的图标文件:

在Linux中快速编译出带图标的windows程序_Go编程

2.4 模拟服务后端程序

模拟服务后端程序主要负责利用rsrc将资源文件编译成.syso格式,并利用go build完成最终的二进程程序编译, 完整代码如下:

package main

import (
	"fmt"
	"os/exec"
)

const (
	hIconPath     = "/home/gocompile/icon/Folder.ico" // 图标文件路径
	ProgramName   = "gocompile"                       // 编译完成最终程序名称
	compileOutput = "./output/gocompile.exe"          // 编译之后最终的输出目录
)

func CompileProgram() {
	cmd := "./rsrc -arch 386 -ico " + hIconPath + " -o " + ProgramName + ".syso" + " && " +
		"CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -o " + compileOutput
	_, err := exec.Command("bash", "-c", cmd).Output()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
}

func main() {
	CompileProgram()
}

利用以下命令将模拟服务后端程序编译成能在Linux系统上运行的程序:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gocontrol

将编译完成的gocontrol程序上传到Linux服务器, 准备完成最终的跨平台程序编译。

3. 交叉编译

在Linux服务器上建立工作目录:/home/gocompile, 在目录下新建code和icon两个目录, 将本地的所有图标文件上传到icon文件夹下;将

编译完成的gocontrol、模拟Windows程序源码、rsrc程序上传到code 目录下, 如图:

在Linux中快速编译出带图标的windows程序_Windows_02

编辑/etc/profile, 在最后加上路径:export PATH=$PATH:/home/gocompile/code,如图 :

在Linux中快速编译出带图标的windows程序_Windows_03

执行: source /etc/profile

进入code目录, 给予gocontrol和rsrc可执行权限, ./gocontrol运行程序, 如果没有错误产生,将在output目录中生成名为gocompile.exe程序,如图:

在Linux中快速编译出带图标的windows程序_跨平台编译_04

4. 结果验证

将output中的gocompile.exe程序拷贝到WIndows系统上,可以看到已经生成了带图标的程序,如图:

在Linux中快速编译出带图标的windows程序_Go编程_05

双击执行该程序, 可以看到已经执行成功:

在Linux中快速编译出带图标的windows程序_跨平台编译_06

标签:文件,编译,windows,程序,rsrc,Windows,Linux,图标
From: https://blog.51cto.com/u_12788968/8502928

相关文章

  • Linux文件管理
    1.1文件目录与路径2.1.1文件目录 所有文件都在根目录(/)下。根目录下文件:2.1.2文件路径  用户在磁盘中查找文件时,所历经的文件线路称为文件路径2.2目录与文件操作目录操作包括创建目录,查看目录,切换目录,删除目录mkdir:创建目录pwd:查看目录ls-a:查看隐藏目录......
  • 戴尔PowerEdge R750 机架式服务器初始安装Windows Server 2019 服务器系统
    公司因为业务需求,从戴尔原厂网购三台R750服务器,戴6块a4显卡和6块960G的SSD,由于没有要求配置RAID和操作系统,现记录一下安装过程。SSD:960G,六块服务器型号:R750RAID类型:RAID1+RAID5,具体说明介绍见DELL官网介绍。 ......
  • Linux系统的Vim编辑器怎么用
    今天公司要换Linux服务器,已经两年不用命令行操作的我赶紧学习起了Linux操作,其实不难,VIM编辑器是内置在Linux系统里面的一款有效的编辑器,功能十分强大,堪称“世界上最好的编辑器”步入正题文件操作【增,删,改,查】【增】新建文件touch新增目录mkdir目录名命令:touch文件名示例:在......
  • Linux部署Java环境
    本文使用的Linux发行版本为AlmaLinux9.264位(CentOS停止更新后的完美替代发行版本)。本文安装的JDK版本为21.0.1,其他版本方法类似。下载并安装Java开发工具包(JavaDevelopmentKit)更新系统。dnf-yupdate获取安装包链接。前往JDK下载官网。找到对应Linux版本的压缩......
  • 13.centos8 关闭防火墙和selinux或者防火墙开启指定端口
    1.firewalld查看防火墙状态systemctlstatusfirewalld关闭防火墙systemctlstopfirewalld开机自启关闭systemctldisablefirewalld开启防火墙   systemctlstartfirewalld开放指定端口   firewall-cmd--zone=public--add-port=1935/tcp--per......
  • 如何在Windows端安装scala
    一.首先确保jdk安装成功  首先在安装之前,确保本地已经安装了JDK1.5以上的版本,在此安装的是1.8版本。并且已经设置了JAVA_HOME环境变量及JDK的bin目录。新建环境变量编辑path系统变量,添加%JAVA_HOME%\bin 验证环境变量是否配置成功。 二.下载Scala安装文件接着我们......
  • 使用开源工具将windows家庭版切换到专业版
    说明工具名称开源地址:https://github.com/massgravel/Microsoft-Activation-Scripts官方简介:使用HWID/Ohook/KMS38/OnlineKMS激活方法的Windows和Office激活器,专注于开源代码和较少的防病毒检测。使用打开工具方法1-PowerShell(推荐)在Windows8.1/10/11......
  • Linux网络配置
     一:桥接:在此连接方式,安装的虚拟机相当于和物理主机是两台独立的计算机,如果局域网中有DHCP服务,那么,虚拟机将能够获得本局域网的IP地址,此时虚拟机的IP网段和主机的IP地址处于同一网段下,两者之间可以通信。如果局域网内没有提供DHCP服务,需要手动配置一个和物理主机在同一个网段下......
  • Linux下创建FTP虚拟用户的配置过程--非系统帐号登录FTP
    前言        在日常的工作中经常会遇到这样的情况,为了ftp的用户的登录安全,需要创建一些FTP账户来连接或登录FTP服务,而又不想让用户拥有系统级别的账号。    尽管也可以在FTP服务器设置让一些用户无法登陆系统,如果需要创建很多ftp用户的需求的话,那和创建这......
  • 配置ArchLinux,st + dwm进行配置极简风格
    更新于2023年11月21日本文进行安装好ArchLinux后进行配置的记录。一些关于本文解决问题的链接【--->整个st的教学<---】【--->st官网<---】【--->解决st和dwm的安装<---】【--->配置清华软件库<---】【--->配置st字体设置<---】【--->makenotfoun......