【问题标题】:How do I create an executable from Golang that doesn't open a console window when run?如何从 Golang 创建一个运行时不打开控制台窗口的可执行文件?
【发布时间】:2014-06-08 15:39:43
【问题描述】:

我创建了一个我想在后台不可见地运行的应用程序(无控制台)。我该怎么做?

(这是针对 Windows,在 Windows 7 Pro 64 位上测试)

【问题讨论】:

  • @kostix 当我搜索没有控制台时,它没有出现。但是您指向的标志在那个答案中,我认为您是对的,尽管语法仍然略有不同,而且我不是在寻找“窗口选项”。

标签: console go


【解决方案1】:

网上找到的文档说我可以用类似的东西编译,

go build -ldflags -Hwindowsgui filename.go

但这会报错:unknown flag -Hwindowsgui

使用最新(1.1?)版本的编译器,这应该可以工作:

go build -ldflags -H=windowsgui filename.go

当我继续搜索时,我发现了一个说明官方文档应该很快更新的注释,但同时有很多旧式示例回答了这个错误。

【讨论】:

  • 发件人:golang.org/cmd/linkOn Windows, -H windowsgui writes a "GUI binary" instead of a "console binary."
  • 嗨,你知道什么标志可以在 macOS 和 linux 上实现相同的效果吗?
【解决方案2】:

使用 Go 版本 1.4.2

 go build -ldflags "-H windowsgui" 

来自 Go 文档:

go build [-o output] [-i] [build flags] [packages]

-ldflags 'flag list' 参数传递每个 5l、6l 或 8l 链接器调用。

【讨论】:

  • 不要忘记您可能需要将您的filename.go 作为参数包含在内。在 v1.10.1 中,以下语法也适用; go build -ldflags -H=windowsgui filename.go.
【解决方案3】:

如果您不想在调试期间每次都输入冗长的构建指令,但仍希望控制台窗口消失,您可以在 main 函数的开头添加以下代码:

package main

import "github.com/gonutz/w32/v2"

func main() {
    console := w32.GetConsoleWindow()
    if console != 0 {
        _, consoleProcID := w32.GetWindowThreadProcessId(console)
        if w32.GetCurrentProcessId() == consoleProcID {
            w32.ShowWindowAsync(console, w32.SW_HIDE)
        }
    }
}

现在您可以使用go build 进行编译。您的程序将在启动时短暂显示控制台窗口,然后立即将其隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多