golang 编译静态库

  1. 使用场景
  2. Demo
    1. 环境介绍
    2. 准备工作
    3. 编译静态库test.a
    4. 编译main.go
    5. 链接main.o
    6. 运行main

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

欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qinhan_shu@163.com

文章标题:golang 编译静态库

本文作者:QinHan

发布时间:2019-12-04, 14:32:04

最后更新:2020-02-20, 05:42:12

原始链接:https://qinhan.site/2019/12/04/go-staticlib/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏