1 动态链接库(dll,so文件)
1.1、 动态库的概念
日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数)。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行链接,这样就不必在每次开发程序时都对这些通用的函数进行编译了。
动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库。其加载方式与静态库截然不同。
1.2、 动态库的命名
Linux下,动态库通常以.so(share object)结尾。(通常/lib和/usr/lib等目录下存在大量系统提供的以.so结尾的动态库文件)
Windows下,动态库常以.dll结尾。(通常C:\windows\System32等目录下存在大量系统提供的以.dll结尾的动态库文件)
1.3 、动态库与静态库之间的区别
静态库是指编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大,但运行时,就不再需要库文件了。即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。
动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。即,程序只在执行启动时才加载动态库,如果删除动态库文件,程序将会因为无法读取动态库而产生异常。
2 Go语言打包成动态链接库文件(dll,so)
2.1 windows下
golang 编译 dll 过程中需要用到 gcc,所以先安装 MinGW。
windows 64 位系统应下载地址为: https://sourceforge.net/project
下载后运行 mingw-w64-install.exe,完成 MingGW 的安装
详细过程及解释,参照文章:【window下MinGW-w64的安装:0-Windows下MinGW-w64的安装 - 知乎 (zhihu.com)】
2.2 mac,Linux下
自带gcc,无需任何安装
2.3 编写Go代码
注意:
1 注释 //export PrintBye 和 //export Sum 在编译 动态库(dll ,so)的时候是必须的,说明了 动态库 需要输出的函数
2 main函数必须写,没有执行代码,作为CGO编译的入口
3 必须引入C库(import "C")
2.4 编译成动态库
2.4.1 编译成so库
go build -buildmode=c-shared -o s1.so s1.go
2.4.2 编译成dll库
go build -buildmode=c-shared -o s1.so s1.go
注意:
1 -o表示输出,s1.so 表示编译成so文件的名字,s1.go表示编译哪个go文件
2 "-s -w" 选项用于减小生成动态链接库的体积,-s 是压缩,-w 是去掉调试信息
go build -ldflags "-s -w" -o main.dll -buildmode=c-shared s1.go
3 编译模式buildmode