Go编译生成ar归档文件而非可执行文件的问题排查
问题:Go编译生成ar归档文件而非可执行文件,运行提示权限拒绝
我编写了一个简单的Go程序:
package kioskify import ( "net/http" "github.com/labstack/echo/v4" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":8000")) }
使用Go 1.22版本,通过命令:
$ go build -ldflags="-s -w" -trimpath -o app
进行编译。尝试运行生成的app时,出现错误:
$ ./app zsh: permission denied: ./app
执行file app命令查看属性,结果显示:
app: current ar archive
此前该编译方式一直正常,请问哪里操作出错了?
解决方案
核心原因是当前目录下存在同名的app.a归档文件,Go编译时直接复用了这个归档文件,将其复制为你指定的输出文件app,而非生成新的可执行文件。
解决步骤:
- 删除或重命名当前目录下的
app.a文件:rm app.a - 重新执行编译命令:
go build -ldflags="-s -w" -trimpath -o app - 验证编译结果,执行
file app,正常应显示可执行文件类型,例如:app: Mach-O 64-bit executable x86_64 # macOS # 或 app: ELF 64-bit LSB executable, x86-64, statically linked, stripped # Linux - 如果运行时仍提示权限问题,手动添加执行权限:
chmod +x app
补充说明:Go编译工具链在指定输出文件名时,若存在同名的.a归档文件(通常是之前编译包生成的缓存文件),可能会出现这种错误复用的情况,清理旧归档文件即可解决。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

