go tool 静态库编译与使用

可能是用的不多,搜了一圈例子很少,大多是那个在 windows 上使用的 demo 的例子,凑个热闹贡献一个 mac / linux 通用的例子吧,并没那么复杂

创建 hello 工程

hellofoocmdfoo.gomain.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/hellofoofoo.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
$> 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
-Imain.ofoo.ahello
$> 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