交叉编译net / http进行分发

我使用以下体系结构在Docker容器中构build了以下代码:
cat / proc / version Linux版本3.16.7-tinycore64(root @ 064f0e1ce709)(gcc版本4.7.2(Debian 4.7.2-5))#1 SMP Tue Dec 16 23:03:39 UTC 2014

package main import "fmt" func main() { fmt.Println("Hello") } 

二进制分布式,在busybox容器上运行没有问题,在没有安装golang的情况下具有相同的体系结构。

问题

当我对以下代码执行相同操作时:

 package main import ( "fmt" "net/http" ) const ( port = ":80" ) var calls = 0 func HelloWorld(w http.ResponseWriter, r *http.Request) { calls++ fmt.Fprintf(w, "Hello, world! You have called me %d times.\n", calls) } func init() { fmt.Printf("Started server at http://localhost%v.\n", port) http.HandleFunc("/", HelloWorld) http.ListenAndServe(port, nil) } func main() {} 

然后我得到:
灰:./hello_world:未find

我可能会缺less一些依赖关系 – 比如“net / http”?
但是我认为构build会把所有东西都build立在二进制文件中。
这是为了去build立和去安装。

任何想法?

答案很可能是本文中描述的。

标准库的一些关键部分使用CGO,如果您交叉编译转到Darwin或Linux,您的程序将不使用系统DNSparsing器。 他们也不能使用本地主机证书存储。 他们也无法查找用户的主目录。

CGO默认dynamic地链接到一些标准的系统接口。

文章build议使用gonative来解决这个问题。 如果这不是你的一杯茶,有人build议使用:

 go build -ldflags "-linkmode external -extldflags -static" 

另请阅读: https : //groups.google.com/d/topic/golang-nuts/H-NTwhQVp-8/discussion

我认为你需要禁用cgo并使用netgo标志来构build:

net包缺省需要cgo,因为主机操作系统通常必须调解networking呼叫设置。 但是,在某些系统上,可以在不使用cgo的情况下使用networking,并且可以这样做,例如避免dynamic链接。 新的构build标签netgo(默认closures)允许在可能的系统中构build纯Go的networking包。

netgo标签需要版本1.2及以上 。