背景:我写了一个功能(在packageA中),不希望任何人看到我的代码。所以我将其安装到.a文件(packageA.a)中。我通过以下方法使用它:
package main
import packageA
func main(){
packageA.Run()
}
那我做
go tool compile -I lib/ main.go
它可以工作。
go tool link -o main -L main.o
但是,当我这样做时,它是行不通的。
我在中编写了另一个功能($GOPATH/src/project/packageB
packageB )并更新main.go
// main.go
package main
import (
"packageA"
_ "project/packageB"
)
func main(){
packageA.Run()
}
执行 go tool compile -I lib/ main.go
但是错误 can't find import "packageB"
我的目录布局
project
main.go
lib/
packageA.a
packageB
xxx.go
想知道这样做是否是一种好习惯,什么是最好的方法?go工具编译如何导入.a文件和源代码?
在此先感谢。
这是一个很大的问题,需要我做一些研究才能回答。
我将假设您的问题实际上只是出于复制目的的一个最小示例,而您的REAL问题是:“如何针对源代码和仅二进制包来编译Go程序?”
让我们逐步完成此步骤
阶段1:生成仅二进制包。
您可能已经拥有仅二进制包,因此您可以根据需要跳过此步骤,但这对于设置上下文很有帮助。
首先,让我们确保您的软件包名称对于文件夹结构而言实际上是正确的。这意味着main.go具有以下导入:
import (
"project/packageA"
"project/packageB"
)
同样,packageB中的源代码(在您的示例中取决于packageA)使用 import "project/packageB"
因此,您最初想要的是一个看起来像这样的结构:
$GOPATH/
src/
project/
main.go
packageA
xxx.go
packageB
xxx.go
您想要编译packageA,使其只是一个静态二进制文件。您可以通过go install .
从packageA
目录运行非常简单地执行此操作。
您现在具有以下结构:
$GOPATH/
pkg/
$ARCH/
project/
packageA.a
src/
project/
main.go
packageA
xxx.go
packageB
xxx.go
阶段2:在不使用packageA的Go源代码的情况下构建main.go
您现在的问题是:我该如何告诉编译器去寻找都在走的源文件src
和链接的二进制文件pkg
?
这里的问题是,如果您只删除packageA,Go编译器工具链将会很混乱-默认情况下,假定缺少Go源代码意味着构建失败。因此,从Go 1.7开始,您可以在packageA内向编译器提供一个构建标志,该标志是“嘿!不要使用此源代码,而应使用链接的二进制文件!”
为此,我们要用如下文件替换 packageA中的源代码内容:
//go:binary-only-package
package packageA
现在,我们要做的main.go
只是使用普通的旧版本go build main.go
,我们已经完成了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句