在Windows上启动Golang生成的二进制文件
在Windows上启动Golang生成的二进制文件 我在某台 Windows 10 机器上创建了一个二进制文件,并尝试在其他机器上启动它,但每次启动应用程序时都会出现如下所示的屏幕。如果我点击“否”,应用程序会启动,但这很烦人并且会让最终用户感到困惑。有什么办法可以避免这种情况吗?

运行其他 .exe 文件时是否也会出现这种情况?
更多关于在Windows上启动Golang生成的二进制文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你是如何尝试启动它的?是直接双击.exe文件吗?这是一个GUI应用程序吗?
skillian:
双击.exe文件?
是的。
它使用 lorca 作为 GUI,
在我点击“否”之后,程序运行顺利,浏览器打开显示 GUI,但这条消息很烦人。
这是Windows的“Windows Defender SmartScreen”警告,因为你的二进制文件没有有效的数字签名。对于未签名的可执行文件,Windows会显示此警告以保护用户免受潜在恶意软件的影响。
以下是几种解决方案:
1. 使用Go的编译标志减少警告(推荐)
在编译时添加-ldflags参数可以显著减少警告出现的概率:
// 编译命令
go build -ldflags="-s -w -H=windowsgui" main.go
或者使用更完整的参数:
go build -ldflags="\
-s -w \
-X main.Version=1.0.0 \
-X main.BuildTime=$(date +'%Y-%m-%d_%H:%M:%S') \
-H=windowsgui" \
-o myapp.exe main.go
2. 添加manifest文件
创建app.manifest文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="*"
name="YourAppName"
type="win32"
/>
<description>Your Application Description</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>
编译时嵌入manifest:
go build -ldflags="-H windowsgui" main.go
# 然后使用mt.exe嵌入manifest
mt.exe -manifest app.manifest -outputresource:main.exe;#1
3. 使用rsrc嵌入图标和版本信息
安装rsrc工具:
go get github.com/akavel/rsrc
创建app.manifest和版本信息文件versioninfo.json:
{
"FixedFileInfo": {
"FileVersion": {
"Major": 1,
"Minor": 0,
"Patch": 0,
"Build": 0
},
"ProductVersion": {
"Major": 1,
"Minor": 0,
"Patch": 0,
"Build": 0
},
"FileFlagsMask": "3f",
"FileFlags": "00",
"FileOS": "040004",
"FileType": "01",
"FileSubType": "00"
},
"StringFileInfo": {
"Comments": "",
"CompanyName": "Your Company",
"FileDescription": "Your Application",
"FileVersion": "1.0.0.0",
"InternalName": "yourapp.exe",
"LegalCopyright": "Copyright © 2024",
"LegalTrademarks": "",
"OriginalFilename": "yourapp.exe",
"PrivateBuild": "",
"ProductName": "Your Product",
"ProductVersion": "1.0.0.0",
"SpecialBuild": ""
},
"VarFileInfo": {
"Translation": {
"LangID": 0x0409,
"CharsetID": 0x04B0
}
}
}
生成.syso文件并编译:
# 生成资源文件
rsrc -manifest app.manifest -ico app.ico -o rsrc.syso
# 编译
go build -ldflags="-s -w -H=windowsgui" main.go
4. 使用UPX压缩(可选但有效)
安装UPX并压缩可执行文件:
# 下载UPX:https://upx.github.io/
upx --best myapp.exe
5. 完整的构建脚本示例
创建build.bat:
@echo off
set APP_NAME=myapp
set VERSION=1.0.0
echo Building %APP_NAME% v%VERSION%...
rem 生成资源文件(如果有rsrc)
if exist rsrc.syso del rsrc.syso
if exist app.manifest (
rsrc -manifest app.manifest -ico app.ico -o rsrc.syso
)
rem 编译
go build ^
-ldflags="-s -w -X main.Version=%VERSION% -H=windowsgui" ^
-o %APP_NAME%.exe main.go
rem 使用UPX压缩(可选)
if exist upx.exe (
upx --best %APP_NAME%.exe
)
echo Build completed: %APP_NAME%.exe
这些方法可以显著减少SmartScreen警告的出现频率。对于完全消除警告,需要购买代码签名证书进行数字签名,但对于大多数内部工具或开源项目,上述方法已经足够。

