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

缺点:

背景:我写了一个功能(在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文件和源代码?

在此先感谢。

Venantius:

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

我将假设您的问题实际上只是出于复制目的的一个最小示例,而您的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在源代码和预编译的二进制文件之间切换

在哪里可以找到较旧的源代码和二进制包版本?

如何从源代码构建的应用程序制作二进制文件或.deb文件?

UEFI固件软件代码(已编译的二进制代码和源代码)保存在哪里?

如何为不同的go版本分发仅二进制包

如何分发仅二进制包

当您是原始作者时,最简单的制作源代码和二进制包的方法是什么?

yum是否可以从源代码进行编译而不是安装预编译的二进制文件?

相同的Java源代码可编译为二进制不同的类

R包安装时间长-源代码或二进制类型

如何获取用于在(.deb)程序包中生成二进制文件的编译器标志?

压缩不包括二进制文件的源代码

从单个C源代码生成库和二进制文件

从源代码编译一个新的二进制文件后,旧的二进制文件会怎样?

如何获取我缺少源代码的Intel Fortran库的64位二进制文件?

使用相同的程序包会污染已编译的二进制文件吗?

在Macbook Pro 2019上针对Amazon AWS EC2交叉编译Go二进制文件

如何仅编译ARM32二进制文件(无经验)

dart支持编译为二进制代码吗?

使用go动态创建编译的二进制文件

如何测试Linux二进制文件是否被编译为位置无关代码?

C ++编译器如何用二进制代码表示int数字?

如何确定哪个Go版本用于编译二进制文件

Ubuntu是从源代码上在其回购中编译其所有非专有软件包,还是使用开发人员的预编译二进制文件?

漏洞扫描程序会扫描源代码还是可执行文件(二进制文件)?

NVIDIA传统二进制专有驱动程序和仅二进制专有驱动程序有什么区别?

如何从交叉编译的二进制文件生成程序集?

如何使用二进制文件自动执行deb程序包?

如何将这个二进制乘法代码的答案带入二进制?