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
你学会了吗?