go tool 静态库编译与使用
可能是用的不多,搜了一圈例子很少,大多是那个在 windows 上使用的 demo 的例子,凑个热闹贡献一个 mac / linux 通用的例子吧,并没那么复杂
创建 hello 工程
首选创建一个 hello
工程,包含了 foo
和 cmd
两个目录分别存放 foo.go
模块和 main.go
- hello/go.mod
module hello
go 1.14
- hello/foo/foo.go
package foo
import "fmt"
func Bar() {
fmt.Println("foobar.")
}
- hello/cmd/main.go
package main
import "hello/foo"
func main() {
foo.Bar()
}
编译
工程目录 /tmp/hello
首先把 foo
模块编译成 foo.a
$> cd /tmp/hello
$> go tool compile -pack foo/foo.go
$> ls -l
drwxr-xr-x 3 liangc wheel 96 4 24 16:22 cmd/
drwxr-xr-x 3 liangc wheel 96 4 24 17:03 foo/
-rw-r--r-- 1 liangc wheel 13926 4 24 17:17 foo.a
-rw-r--r-- 1 liangc wheel 22 4 24 16:19 go.mod
可以看到我们已经得到了想要的 foo.a
,接下来编译 main 函数
$> go tool compile -I /tmp/ cmd/main.go
$> ls -l
drwxr-xr-x 3 liangc wheel 96 4 24 16:22 cmd/
drwxr-xr-x 3 liangc wheel 96 4 24 17:03 foo/
-rw-r--r-- 1 liangc wheel 13926 4 24 17:17 foo.a
-rw-r--r-- 1 liangc wheel 22 4 24 16:19 go.mod
-rw-r--r-- 1 liangc wheel 4944 4 24 17:19 main.o
参数中的 -I
是告诉编译器在哪个目录加载依赖库,接下来链接 main.o
和 foo.a
得到 hello
,并执行
$> go tool link -o hello -L /tmp/ main.o
$> ls -l
drwxr-xr-x 3 liangc wheel 96 4 24 16:22 cmd/
drwxr-xr-x 3 liangc wheel 96 4 24 17:03 foo/
-rw-r--r-- 1 liangc wheel 13926 4 24 17:17 foo.a
-rw-r--r-- 1 liangc wheel 22 4 24 16:19 go.mod
-rwxr-xr-x 1 liangc wheel 2165864 4 24 17:22 hello*
-rw-r--r-- 1 liangc wheel 4944 4 24 17:19 main.o
$> ./hello
foobar.
大功告成,link
参数中的 -L
也是指定依赖库的目录