Go编译报错go build: build output “dirmain“ already exists and is a directory

本文介绍在使用Go编译器时遇到的一个常见问题:当尝试编译一个与当前目录同名的包时出现错误。文章提供了两种解决方案:一是通过指定输出文件名避免与目录重名;二是切换到另一个目录进行编译。

比如当前目录是$GOPATH/src/GO1209,当前目录有个文件夹dirmain是一个包,如果指定包的文件夹进行编译,会报错输出文件dirmain在当前目录已经存在并且是个目录:

VMCatalina:src haypin$ tree Go1209
Go1209
├── dirmain
│   ├── go.mod
│   ├── gomain.go
│   ├── gomain2.go
│   └── gomain3.go
VMCatalina:src haypin$
VMCatalina:Go1209 haypin$ go build Go1209/dirmain
go build: build output "dirmain" already exists and is a directory

因为不论在Windows还是在Linux或者在Unix中,目录也是个文件,其中存储着目录中内容(子目录或文件)的名字——文件节点指针的映射,具体参考《鸟哥的Linux私房菜》基础篇讲解文件系统部分,因此同一目录下的子目录和文件不允许重名。

解决办法:

1、通过-o [output]选项指定生成文件名使不与子目录重名:

VMCatalina:Go1209 haypin$ go build -o pkgmain Go1209/dirmain
VMCatalina:Go1209 haypin$ tree ../Go1209
../Go1209
├── dirmain
│   ├── go.mod
│   ├── gomain.go
│   ├── gomain2.go
│   └── gomain3.go
├── pkgmain
VMCatalina:Go1209 haypin$ 

这里还有一个有意思的地方,如果-o [output]选项指定的生成文件名与包文件夹名最后一段同名,则会输出生成文件到包文件夹下,Go还是很聪明的,不会自己犯蠢:

VMCatalina:Go1209 haypin$ go build -o dirmain Go1209/dirmain
VMCatalina:Go1209 haypin$ tree ../Go1209
../Go1209
├── dirmain
│   ├── dirmain
│   ├── go.mod
│   ├── gomain.go
│   ├── gomain2.go
│   └── gomain3.go
VMCatalina:Go1209 haypin$

2、这还不简单,新建一个文件夹然后cd到新建文件夹再编译生成,那生成文件就在pwd下了:

VMCatalina:Go1209 haypin$ mkdir tempDir
VMCatalina:Go1209 haypin$ cd tempDir
VMCatalina:tempDir haypin$ go build Go1209/dirmain
VMCatalina:tempDir haypin$ cd ..
VMCatalina:Go1209 haypin$ tree ../Go1209
../Go1209
├── dirmain
│   ├── dirmain
│   ├── go.mod
│   ├── gomain.go
│   ├── gomain2.go
│   └── gomain3.go
└── tempDir
    └── dirmain
VMCatalina:Go1209 haypin$

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值