golang 编译静态库

Golang 静态库的编译 & 使用

使用场景

  • 我开发第一个库,给第三方使用,但是不想直接提供源代码给他们,就可以直接编译一个静态文件给他们使用

Demo

环境介绍

  • 系统为 mac os x
  • $GOPATH/Users/qinhan/go

准备工作

  • 首先我在 $GOPATH/src 下建立一个名为 test 的目录

  • 该目录下只有一个名为 test.go 的文件,只有一个名为 Show 的函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    test echo $GOPATH
    /Users/qinhan/go

    test pwd
    /Users/qinhan/go/src/test

    test ls
    test.go

    test cat test.go
    package test

    import "fmt"

    func Show() {
    fmt.Println("hello!")
    }
  • 然后我在 $GOPATH 下有一个 main.go

  • 主函数调用了 $GOPATH/src/test/test.go 中的 Show 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  src echo $GOPATH
/Users/qinhan/go

➜ src pwd
/Users/qinhan/go/src

➜ src cat main.go
package main

import "test"

func main() {
test.Show()
}
  • 运行
    1
    2
    ➜  src go run ./main.go
    hello!

编译静态库test.a

  • 接下来我们进入 $GOPATH/src 目录下
  • test 库编译成静态库
1
go install test
  • 这样会在 $GOPATH/pkg 的相应目录下生成静态库
  • 因为我的平台为 mac, 因此路径为 $GOPATH/pkg/darwin_amd64/test.a
  • win 平台路径一般为 $GOPATH\pkg\windows_amd64\test.a

编译main.go

  • 进入main.go所在目录,编译main.go:
1
2
3
4
5
6
7
8
9
10
11
➜  src pwd
/Users/qinhan/go/src

➜ src ls | grep main
main.go

➜ src go tool compile -I $GOPATH/pkg/darwin_amd64 main.go

➜ src ls | grep main
main.go
main.o
  • 可以看到生成了名字 main.o 的目标文件

链接main.o

  • -L 选项指定了静态库 test.a 的路径,即 $GOPATH/pkg/darwin_amd64 目录,链接成功后会生成相应的可执行文件 main
1
2
3
4
5
6
7
8
9
10
11
12
13
➜  src pwd
/Users/qinhan/go/src

➜ src ls | grep main
main.go
main.o

➜ src go tool link -o main -L $GOPATH/pkg/darwin_amd64 main.o

➜ src ls | grep main
main
main.go
main.o

运行main

1
2
3
4
5
6
7
8
9
10
➜  src pwd
/Users/qinhan/go/src

➜ src ls | grep main
main
main.go
main.o

➜ src ./main
hello!
  • 现在,就算把 $GOPATH/src/test 目录删除,再次编译链接 main.go,也能正确生成 main
  • 但是,如果删除了静态库 test.a, 就不能编译 main.go