目录

go 代码调用第三方包正常构建报 undefined

go 代码调用第三方包正常,但是构建报 undefined

背景

使用了自己封装的 utils 包,导入调用函数时是正常的,但是执行go build却突然报错“undefined: utils.Get”。这篇就把调用第三方包报“undefined”的各种常见场景和排查解决方法整理出来,希望能够帮大家少走弯路

场景一:依赖未下载(最高频)

新手最常犯的错:只写了导入语句,没执行下载命令,或下载过程中因网络问题中断,导致依赖目录下没有对应包文件。

不过这一般不是问题,也是本次我遇到的场景,因为没有下载依赖,编译器(Goland)是会报红的,而我这里是可以正常调用,但是无法编译

排查步骤:

  1. 查看项目根目录的go.mod文件,看是否有github.com/gin-gonic/gin的依赖记录——没有则说明依赖未被添加。

  2. 查看$GOPATH/pkg/mod目录(或项目的vendor目录),看是否有github.com/gin-gonic/gin@xxx的文件夹——没有则说明包未下载。

场景二:第三方包版本不兼容(API已删除/更名)

升级第三方包后突然报错“undefined”,大概率是版本迭代中API被删除或更名了。比如gin 1.x版本有gin.Colorer()函数,2.x版本直接移除了这个接口。

和场景一一样,一般编译器都会报错

场景三:导入的库存在问题

比如我这里使用了 utils.Get 函数,导包是正常的,依赖也下载正常,并且编译器(Goland) 也没有报错

get, err := utils.Get(a.Url, nil, params)
    if err != nil {
        logs.Errorf("Get %s err:%v", a.Url, err)
        return nil, err
    }

utils.Get 是自定义封装的库

文件正常调用了 utils.Get,也没有报错。但是 go build 编译却报错 :

application\model.go:75:18: undefined: utils.Get

编译器没有提示错误,导包也是正常的,但是执行 go build 或者 go run 时缺提示 undefined

排查结果:

这是因为导入的包中引用了 C 代码,可以打开 导入的函数所在的文件 xxx.go,Goland 工具可以看到文件顶部会有提示

import C
'xxx.go' is ignored by the build tool because of the cgo support mismatch

这大部分情况是因为 idea 自动导包导错了,很蛋疼

解决方法也很简单:

如果 import ‘C’ 确实不是你导入的包,那么只需要删除这行导包代码即可,然后 go build 就可以编译成功了

那么如果你确实是需要导入 C 代码,那么则需要安装配置 CGO 的编译环境,(这里我没有试过,有没有用过的小伙伴的小伙伴可以评论区分享下!!!)

方法一:

打开文件,找到 import ‘C’ ,删除即可,重新编译即可

方法二:

如果确实需要导入 C 代码,则

安装配置 cgo 的编译环境(没试过)

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/go-err-import-c/

备用原文链接: https://blog.fiveyoboy.com/articles/go-err-import-c/