• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go语言非main包编译为静态库并使用的示例代码

    Go语言项目中基本上都是以源码的形式提供包,对公司或者企业而言,如果想要隐藏关键代码怎么办?
    我们可以将Go的非main包编译为静态库提供给用户使用。下面以Windows为例,介绍一下如何将Go的非main包编译为静态库,用户又将如何使用。

    一、环境

    笔者使用的VSCode,在终端中查看Go的环境变量,主要看GOROOT以及GOPATH,笔者的GOROOT在C:\Program Files\Go。

    二、常规工程

    在任意地方新建一个目录,假设为test,然后使用VSCode打开。我们创建如下3个工程文件:
    main.go

    package main
    
    import (
    	"test/libDemo"
    )
    
    func main() {
    	libDemo.CallMe()
    }

    go.mod

    module test
    
    go 1.16

    libDemo.go

    package libDemo
    
    import "fmt"
    
    func CallMe() {
    	fmt.Println("libDemo Be Call...")
    }

    目录结构如下图所示:

    在main.go文件窗口,按F5运行,可以看到正常执行结果:

    三、将libDemo编译为静态库

    1. 移动libDemo

    将libDemo目录移动到${GOROOT}\src下,笔者的为C:\Program Files\Go\src。此时再运行会报错了:

    主要是import的路径不对了,把test/去掉即可。

    2. 编译libDemo为静态库

    $ go install libDemo

    此时可以在C:\Program Files\Go\pkg\windows_amd64中看到相应的静态库文件libDemo.a

    3. 将libDemo源码从C:\Program Files\Go\src移动走,即模拟用户没有源码,只有静态库的情况。

    此时再运行又会出现找不到libDemo的错误,不能直接运行了。

    4. 编译main.go

    进入main.go所在目录,编译main.go:

    go tool compile -I "C:\Program Files\Go\pkg\windows_amd64" main.go

    在编译时需要加入-I选项包含目录路径"C:\Program Files\Go\pkg\windows_amd64",路径中有空格需要加引号,编译成功后会生成main.o

    5. 链接main.o

    go tool link -o test.exe -L "C:\Program Files\Go\pkg\windows_amd64" main.o

    -L选项指定链接时搜索的库路径,链接成功会生成test.exe

    6. 运行test.exe

    可以看到正常输出:

    $ ./test.exe
    libDemo Be Call...

    如果我们把C:\Program Files\Go\pkg\windows_amd64\libDemo.a删除,再链接就会报错:

    C:\Program Files\Go\pkg\tool\windows_amd64\link.exe: cannot open file C:\Program Files\Go\pkg\windows_amd64\libDemo.a: open C:\Program Files\Go\pkg\windows_amd64\libDemo.a: The system cannot find the file specified.

    到此这篇关于Go语言非main包编译为静态库并使用的示例代码的文章就介绍到这了,更多相关Go语言静态库编译及使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • go语言静态库的编译和使用方法
    上一篇:golang的串行处理和并行处理区别
    下一篇:Golang 实现 Redis系列(六)如何实现 pipeline 模式的 redis 客户端
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go语言非main包编译为静态库并使用的示例代码 语言,非,main,包编,译为,