Go 1.11 二进制包使用中出现cannot find pac
2019-09-28 本文已影响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(){
}
注:第一次写,有问题请指正。