linux - 如何编译静态链接的go程序(1.3)?

标签 linux go debian static-linking

我正在尝试静态编译一个小的 go 程序(为了玩 Rocket)。我在 Debian Jessie(薄荷版)上运行。我安装了 golang-go 包。 Rocket 文档给出了如何为 go 版本 1.4 和 1.5 进行静态编译的示例

1.4
$ CGO_ENABLED=0 GOOS=linux go build -o hello -a -installsuffix cgo .

1.5:
$ CGO_ENABLED=0 GOOS=linux go build -o hello -a -tags netgo -ldflags '-w' .

不幸的是,go version 说我正在运行 1.3。

$ go version
go version go1.3.3 linux/amd64

我尝试了 1.4 版本,希望它适用于 1.3,但没有这样的运气。我不确定我是否安装了我什至需要的所有 debian 软件包?

能够编译该文件并使用 go build howdy.go 运行它。这个小应用程序按预期工作,但 ldd 显示它有多个动态依赖项:

$ ldd howdy
    linux-vdso.so.1 (0x00007ffe72d7e000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3b22e5a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3b22ab1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3b23077000)

为了完整披露,我尝试静态编译的小程序 (howdy.go) 是:

package main

import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Printf("request from %v\n", r.RemoteAddr)
        w.Write([]byte("howdy\n"))
    })
    log.Fatal(http.ListenAndServe(":5000", nil))
}

此外,go -x 的输出是:

$ go build -x howdy.go
WORK=/tmp/go-build496765737
mkdir -p $WORK/command-line-arguments/_obj/
cd /home/travisg/rkt-v0.10.0
/usr/lib/go/pkg/tool/linux_amd64/6g -o $WORK/command-line-arguments.a -trimpath $WORK -p command-line-arguments -complete -D _/home/travisg/rkt-v0.10.0 -I $WORK -pack ./howdy.go
cd .
/usr/lib/go/pkg/tool/linux_amd64/6l -o howdy -L $WORK -extld=gcc $WORK/command-line-arguments.a

go env 的输出是:

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH=""
GORACE=""
GOROOT="/usr/lib/go"
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"

最佳答案

这对我有用:

CGO_ENABLED=0 \
go build -a -installsuffix cgo -ldflags '-s' -o server server.go

来自:

https://github.com/golang/go/issues/9344

关于linux - 如何编译静态链接的go程序(1.3)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33616064/

相关文章:

linux - 回声 $ 是什么?在 Linux 终端?

java - Linux 上的 JOGL 没有 glcontext 和 XInitThreads()

linux - 在 bash 脚本中获取包含下划线的文件

java - Java获取Linux当前用户名的方法

linux - "/bin/bash cd ~"结果为 "/bin/bash: cd: No such file or directory",为什么?

linux - 删除除最后两个修改最多的文件夹之外的所有文件夹的脚本?

json - 嵌套的 JSON golang 映射

go - golang 插件可以用于工厂功能吗?

csv - Golang : While processing CSV, 重新格式化单行?

java - 编译错误: org. eclipse.jdt.internal.compiler.classfmt.ClassFormatException