在Windows上启动Golang生成的二进制文件

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

enter image description here

4 回复

运行其他 .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警告的出现频率。对于完全消除警告,需要购买代码签名证书进行数字签名,但对于大多数内部工具或开源项目,上述方法已经足够。

回到顶部