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

3 使用python语言来调用