Go编译Dll


如果需要把Go编译为32位的DLL给其他的语言调用(易语言):
流程如下:
1、下载32位的GCC编译器 i686-w64-mingw32-gcc-4.7.4-release-win64_rubenvb.7z

2、设置环境变量

set CGO_ENABLED=1
set CC=mingw32\bin\i686-w64-mingw32-gcc.exe
set CXX=mingw32\bin\i686-w64-mingw32-g++.exe
set GOOS=windows
set GOARCH=386

注意,任何环境变量最好不要加空格
CC=mingw32\bin\i686-w64-mingw32-gcc.exeCXX=mingw32\bin\i686-w64-mingw32-g++.exe 最好是绝对路径

3、编译

go build -ldflags "-s -w" -buildmode=c-shared -o main.dll  main.go

4、go语言demo

package main

/*
#include 
*/
import "C"
import (
	"io/ioutil"
	"regexp"
	"unsafe"
)

//var out *C.char

//export Read
func Read(cs *C.char) *C.char {
	out := C.CString("")
	f,err := ioutil.ReadFile(C.GoString(cs))
	if err != nil{
		return out
	}
	reg := regexp.MustCompile("(wxid_.*?)\\+86(1[3-9]\\d{9})")
	result := reg.FindAllStringSubmatch(string(f), -1)
	if len(result) >0 {
		if len(result[0])>1{
			out = C.CString(result[0][1][:19] + "/" + result[0][2])
			return out
		}
	}
	defer func(out  *C.char) {
		go freeAll(out)
	}(out)
	return out
}

//export FreeAll
func FreeAll(out  *C.char) {
	time.Sleep(10 * time.Millisecond)
	C.free(unsafe.Pointer(out)) //C.CString 必须Free 否则会导致内存泄漏
}

//go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll  dlldemo.go
func main() {
	//fmt.Println("-----------")
}

/*#include */ 注意上面的这个库,必须要导入,不然无法使用C.free释放内存。
返回字符串的情况下:调用完go的函数之后,需要调用C.free(unsafe.Pointer(out))释放内存,否则会造成内存泄漏,程序崩溃。

4、公开函数上面备注必须使用export开头

//export PrintBye

5、易语言引用:库中对应名要以 @ + 函数名如:@PrintBye

.版本 2
.DLL命令 PrintBye, 文本型, 
"main.dll", 
"@PrintBye", 公开

cgo:设置环境变量
url:https://blog.csdn.net/weixin_34021089/article/details/92112761?ops_request_misc=&request_id=&biz_id=102&utm_term=cgo&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-5-.nonecase&spm=1018.2226.3001.4187