在linux平台下直接编译的二进制文件,无法直接在其他平台运行,今天我就遇到了在windows上运行失败,于是找了一下如何解决。

Mac 下编译 Linux 和 Windows 64位可执行程序

 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux 下编译 Mac 和 Windows 64位可执行程序

    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
    CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Windows 下编译 Mac 和 Linux 64位可执行程序

    SET CGO_ENABLED=0
    SET GOOS=darwin
    SET GOARCH=amd64
    go build

    SET CGO_ENABLED=0
    SET GOOS=linux
    SET GOARCH=amd64
    go build

当CGO_ENABLED=1, 进行编译时, 会将文件中引用libc的库(比如常用的net包),以动态链接的方式生成目标文件。
当CGO_ENABLED=0, 进行编译时, 则会把在目标文件中未定义的符号(外部函数)一起链接到可执行文件中。

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)

GOARCH:目标平台的体系架构(386、amd64、arm)

#CGO_ENABLED=0
$ ldd httpserver.exe 
        不是动态可执行文件
$ ldd httpserver
        linux-vdso.so.1 (0x00007ffc9bbd0000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f73c5eab000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f73c5cb9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f73c5eeb000)