这是 Go 中的Hello 世界:
package main
import (
"fmt"
)
func main() {
fmt.Println("Go is great!")
}
将其放入hello.go
并编译:
go build -o hello_go_build hello.go
go build -o hello_go_build_gccgo --compiler gccgo hello.go
gccgo -o hello_gccgo_shared hello.go
gccgo -static -o hello_gccgo_static hello.go
首先,我注意到hello_go_build_gccgo
并且hello_gccgo_shared
大小不一样。我在互联网上寻找信息没有成功。有谁知道这是为什么?或者更好的是,有人能告诉我如何解决这个问题吗?我试图保留带有-work
标志的临时文件,但我找不到相关信息。
然后,您可能会注意到,两个静态链接的二进制文件的大小也不相同。实际上,使用go build
( hello_go_build
) 命令编译的那个不仅适用于我的系统,而且适用于具有其他 Linux 发行版的其他系统,而hello_go_build_gccgo
在我的系统以及其他出现错误的系统上失败:
panic: runtime error: invalid memory address or nil pointer dereference
这是一个即将解决的错误:https ://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/y2RIy0XLJ24
最后,即使现在,大小不再重要,我很好奇:是否有任何 go 编译器可以选择进行函数级链接(而不是静态链接一个包作为一个整体,只链接所需的函数及其依赖项)?