美文网首页
Go 1.11 二进制包使用中出现cannot find pac

Go 1.11 二进制包使用中出现cannot find pac

作者: 沙场点将 | 来源:发表于2019-09-28 21:19 被阅读0次

1、现象

在go中需要对外发布包给用户使用,但是由于不能提供开源包,所以采用二进制包形式(由于某些原因只能采用这中方式)。按照之前go打包的方式首先采用

go build -tags "${BUILD_TAGS}" -i -o $pkgDirectory/$frameworkDir.a

方式打包二进制包生成.a 文件;
接着使用脚本生成发布的go文件
文件格式如下

//go:binary-only-package

package mypack.a

//声明
func a(){
  .....
}

在我们之前的项目中这种方式时好使的,因为我们之前使用的时go 1.8;但是现在这种方式使用时会出现如下的错误

cannot find package encoding/json (using -importcfg)
cannot find package XXXXXXXXX (using -importcfg)
/usr/local/go/pkg/tool/linux_amd64/link: cannot open file : open : no such file or directory

这个时候我们使用

go build -x 

查看编译详细过程,我们能看到打印如下:

cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile skillexec=/root/.cache/go-build/5c/5cb87f7186cce13a26403f25b0b58be401996de3b7a30fd5cec976aeb63aa4d5-d
packagefile syscall=/usr/local/go/pkg/linux_arm64/syscall.a
packagefile runtime=/usr/local/go/pkg/linux_arm64/runtime.a
packagefile errors=/usr/local/go/pkg/linux_arm64/errors.a
.........
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/linux_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=wXO8Fkarg-ul4F28mNmn/O6_brzWOYjAuNbD_PT4v/qxVrSxbhe8F50Mnc5h4p/wXO8Fkarg-ul4F28mNmn -extld=/usr/gcc-aarch64/bin/aarch64-linux-gnu-gcc /root/.cache/go-build/5c/5cb87f7186cce13a26403f25b0b58be401996de3b7a30fd5cec976aeb63aa4d5-d
# skillexec
cannot find package encoding/json (using -importcfg)
cannot find package XXXXXXXXX (using -importcfg)
/usr/local/go/pkg/tool/linux_amd64/link: cannot open file : open : no such file or directory

到这里,我们能够很明显的看到后面报错未找到的包其实没有被go写进importcfg.link这个文件;这一点很关键,在看看自己包引用的关系,你会发现写进了importcfg.link的包实际上只有你在源代码中使用了的,而.a包中使用的是没有被解析出来的。但是这些包都在pkg文件中。

2、解决办法

其实要解决这个问题,就是在go文件中写入包含的包就可以了。所以咱们需要在发布二进制包的时候写入这个包引用。
也就是发布文件中文件格式如下

//go:binary-only-package

package mypack.a

import (
          "encoding/json"
          "XXXXXXXXX"
)

//声明
func a(){
 
}

3、总结

使用二进制包时,我们需要在发布go文件中加上包依赖也写进该文件中。

//go:binary-only-package

package mypack.a

import (
           "encoding/json"
          "XXXXXXXXX"
)

再提一句,其实发布的go文件中只有上面这段是有用的。

而下面这段代码是假的,相当于头文件中的声明。而且不会被编译进去。

//声明
func a(){
  
}

注:第一次写,有问题请指正。

相关文章

网友评论

      本文标题:Go 1.11 二进制包使用中出现cannot find pac

      本文链接:https://www.haomeiwen.com/subject/ocuiyctx.html