go

GO 使用静态链接库编译 生成可执行文件 使用第三方 .a 文件,无源码构造

 

go build 和 go install 都需要使用源码来进行编译。但是有时候我们只有.a或者.so文件。并不能获取到第三方库的源码,这时我们需要静态链接库编译的技巧;

上图是实验前的文件分布。

使用静态链接库编译命令:

➜  src go tool compile -I ../pkg/darwin_amd64/  callyx.go 
➜  src go tool link -o call2 -L ../pkg/darwin_amd64/ callyx.o

实验后文件分布:

由图中我们可以看到,可执行文件生成。

 

 

 

 

 

 

现在可以使用-linkshared标志

您需要做的是首先运行以下命令:

go install -buildmode=shared -linkshared  std

(以上代码使所有通用软件包都可共享!)然后

go install  -buildmode=shared -linkshared userownpackage

最后,在编译代码时,您需要运行:

go build -linkshared yourprogram

上面这些就是什么,而不是静态链接所有内容而仅动态链接它们,您最终将获得更小的编译文件。为了让您了解我的带有静态链接的“ hello.go”文件为2.3MB,而使用动态链接的相同代码仅为12KB!

  • 7
    这就是我想要的。但是给-buildmode=shared not supported on darwin/amd64我的Mac。 – rezam 17年 5月6日在16:40
  •  
    我能够完美地创建一个.so,但是如何将程序的方法放入该.so中呢?我的程序名称也是sample.go,它的包也具有相同的名称,它创建一个名为libcommand-line-arguments.so的.so – immukul 20年 9月4日,4:32
 

8

现在可能!我使用Go构建了一个.so文件,然后非常轻松地将其导入python!这是我喜欢的文章:http : //www.darkcoding.net/software/building-shared-libraries-in-go-part-1/

7

Go执行模式构建Go软件包描述为共享库

“在这种模式下,可以将一个Go包或一组包构建为共享库。导入该Go包中的一个或多个Go包的Go程序可能会与此共享库链接。共享库可能会在两次之间更改Go程序已链接并处于运行时间;该程序启动时可用的共享库是将要使用的共享库...

在Go 1.5发行版中,仅针对linux-amd64目标实现了该功能。使用gccgo时,它会针对任何受支持的目标实施。”

  • 1个
    我回到这个问题,也写了一个更新。+1 –  Mihai Stancu 2015年 8月27日在10:19

5

显然,这是可能的,但只有在非常精确的情况下才可以。更准确地说,如果您是为Android平台编写的。

GitHub上的“ goandroid”项目提供了一组补丁,这些补丁使Go可以构建一个共享库以供Android NDK特定使用。参见https://github.com/eliasnaur/goandroid

  • 1个
    目前(2013年7月),它是Go Tools的扩展,并未内置于Google随附的Go Tools中。 – nsg 13年 7月13日在4:02
  •  
    @Nate您可以链接到该扩展程序吗?(独立)扩展程序只能在android上使用还是可以在桌面使用? –  Mihai Stancu,2015年 7月8日,19:57
  •  
    @mihaistancu我想交叉编译go for android并不难,请参见此处考虑到golang 1.5支持iOS,将很快获得官方支持。 –  nsg 2015年 7月9日在21:37
  •  
    @Nate-我的问题是:“该扩展在android上起作用,还是我(当前)可以将桌面go包编译为共享对象?”。 –  Mihai Stancu 2015年 7月9日在22:31
  •  
    @Nate所以我根本没有兴趣为android进行编译。我只想为桌面编译共享对象。我自己研究了该主题,并且显然有一些带有go build -shared标志的编译器支持 –  Mihai Stancu 2015年 7月9日在22:34
posted @ 2021-02-04 15:09  zJanly  阅读(101)  评论(0编辑  收藏  举报