golang语言 无源码使用静态库(.a文件)手动静态编译链接程序

使用场景

go语言默认全部从源码静态编译,如果没有源码,只有静态库.a文件时如何进行编译呢?
假如你不想暴露源码给别人,别人又不想使用动态库,那么这个就派得上用场了。

文件 hello.go (假定为需要保护的源码)

package hello

import "log"

func Hello() {
   log.Println("hello")
}

文件 main.go (别人调用hello的示例代码)

package main

import "hello"

func main() {
   hello.Hello()
}

我们对需要保护的源码进行生成.a文件的静态库,然后再分发给其他人使用。

#编译hello.go文件(代码无第三方依赖),可用 -o 参数将静态库输出到指定路径(默认当前路径)。
go tool compile -o ./lib/hello.o hello.go
#有第三方依赖,用 -I 参数指定依赖的静态库路径(默认仅只在[$GOROOT/pkg/$GOOS_$GOARCH]搜索)
go tool compile -o ./lib/hello.o -I ./lib/ hello.go

别人拿到我的静态库怎么用呢?

#例如别人把我的.a静态库文件放到项目根路径下的lib内,那么他可以这样编译他的go文件
go tool compile -o main.o -I ./lib/ main.go
#最后是链接成可执行文件(-L 指定依赖静态库的路径)
go tool link -o main.exe -L ./lib/ main.o
#当然还可以使用 -w -s 缩小体积
go tool link -o main.exe -w -s -L ./lib/ main.o

你学会了吗?

你可能感兴趣的:(golang,go语言,golang)