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.exe
和CXX=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 <stdlib.h>
*/
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 <stdlib.h>*/
注意上面的这个库,必须要导入,不然无法使用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