gpt4 book ai didi

go - 如何针对源代码和二进制包编译 Go 程序?

转载 作者:IT王子 更新时间:2023-10-29 02:09:51 26 4
gpt4 key购买 nike

背景:我写了一个特性(在 packageA 中)并且不想让任何人看到我的代码。所以我将它安装到 .a 文件(packageA.a)中。我通过以下方法使用它:

package main  
import packageA
func main(){
packageA.Run()
}

然后我做


go tool compile -I lib/ main.go<br/>
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 tool compile 如何导入.a文件和源码?

在此先致谢。

最佳答案

这是一个很好的问题,需要我做一些研究才能回答。

我假设您的问题实际上只是一个用于复制目的的最小示例,并且您的真实问题是:“我如何根据源代码和 binary-only packages 编译 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,使其只是一个静态二进制文件。您可以通过从 packageA 目录运行 go install . 来非常简单地完成此操作。

您现在具有以下结构:

$GOPATH/
pkg/
$ARCH/
project/
packageA.a
src/
project/
main.go
packageA
xxx.go
packageB
xxx.go

第 2 阶段:在没有 packageA 的 Go 源的情况下构建 main.go

你现在的问题是:我如何告诉 Go 编译器在 src 链接中查找both go 源文件pkg?

中的二进制文件

这里的问题是,如果你只是删除 packageA,Go 编译器工具链将会混淆 - 默认情况下它假定缺少 Go 源代码意味着构建失败。因此,从 Go 1.7 开始,您可以做的是在 inside packageA 中为编译器提供一个构建标志,上面写着“嘿!不要使用此源代码,请为此使用链接的二进制文件!”

为此,我们要用如下所示的文件替换 packageA 中的源代码内容:

//go:binary-only-package

package packageA

现在,构建 main.go 所需要做的只是使用普通的旧 go build main.go 就完成了。

关于go - 如何针对源代码和二进制包编译 Go 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com