带/cmd多入口结构的Go项目编译失败求助
单个Go项目完全支持多编译入口点
当然可以!在Go项目里把不同的二进制入口放在cmd/目录下是非常标准的做法,很多知名Go项目(比如Kubernetes、Docker相关工具)都采用这种结构。你遇到的问题并不是多入口点本身的限制,而是编译过程中出现了异常,导致生成的不是正确的可执行文件。
先分析你遇到的错误
你生成的test文件只有29kb,远小于正常Go二进制的大小(通常至少几MB),且运行时出现语法错误,这说明编译出的文件根本不是当前系统能执行的二进制文件。最常见的原因是交叉编译环境变量未重置:比如你之前可能设置过GOOS或GOARCH环境变量(比如想编译Windows下的exe文件),但之后没恢复,导致编译产物和当前系统不兼容。
解决步骤和正确的编译方式
1. 检查并重置Go环境变量
先确认当前的Go编译目标平台:
go env GOOS GOARCH
输出应该和你当前的系统匹配(比如Linux下是linux amd64,macOS Intel是darwin amd64,Apple Silicon是darwin arm64)。如果输出不对,重置环境变量:
- Linux/macOS:
unset GOOS unset GOARCH - Windows(CMD):
set GOOS= set GOARCH=
2. 正确编译多个入口
从项目根目录(~/go/src/bitbucket.org/a/b)执行以下命令,分别编译两个入口:
- 编译
cmd/c,输出到bin/c(建议用bin目录统一管理二进制文件):GO111MODULE=on go build -o bin/c ./cmd/c - 编译
cmd/d,输出到bin/d:GO111MODULE=on go build -o bin/d ./cmd/d
执行后,你会在bin目录下得到两个正常大小的可执行文件,直接运行即可。
补充说明
如果不指定-o参数,go build默认会把二进制文件生成在当前目录,名字就是包的最后一级目录名(也就是c或d),所以之前你执行GO111MODULE=on go build ./cmd/c后,其实已经在根目录生成了c文件,只是你没注意到而已。
内容的提问来源于stack exchange,提问作者ik9999
相关产品推荐
相关产品推荐

