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!
现在可能!我使用Go构建了一个.so文件,然后非常轻松地将其导入python!这是我喜欢的文章:http : //www.darkcoding.net/software/building-shared-libraries-in-go-part-1/
Go执行模式将构建Go软件包描述为共享库:
“在这种模式下,可以将一个Go包或一组包构建为共享库。导入该Go包中的一个或多个Go包的Go程序可能会与此共享库链接。共享库可能会在两次之间更改Go程序已链接并处于运行时间;该程序启动时可用的共享库是将要使用的共享库...
在Go 1.5发行版中,仅针对linux-amd64目标实现了该功能。使用gccgo时,它会针对任何受支持的目标实施。”
-
1个我回到这个问题,也写了一个更新。+1 – Mihai Stancu 2015年 8月27日在10:19
显然,这是可能的,但只有在非常精确的情况下才可以。更准确地说,如果您是为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
-
-
@Nate-我的问题是:“该扩展仅在android上起作用,还是我(当前)可以将桌面go包编译为共享对象?”。 – Mihai Stancu 2015年 7月9日在22:31
-
@Nate所以我根本没有兴趣为android进行编译。我只想为桌面编译共享对象。我自己研究了该主题,并且显然有一些带有
go build -shared
标志的编译器支持。 – Mihai Stancu 2015年 7月9日在22:34
-buildmode=shared not supported on darwin/amd64
我的Mac。 – rezam 17年 5月6日在16:40