阳光漫步 發表於 2022-5-10 15:12:00

Go编译Dll

<p>如果需要把Go编译为32位的DLL给其他的语言调用(易语言):<br>
流程如下:<br>
1、下载32位的GCC编译器 i686-w64-mingw32-gcc-4.7.4-release-win64_rubenvb.7z</p>
<p>2、设置环境变量</p>
<pre><code>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

</code></pre>
<blockquote>
<p>注意,任何环境变量最好不要加<code>空格</code><br>
<code>CC=mingw32\bin\i686-w64-mingw32-gcc.exe</code>和<code>CXX=mingw32\bin\i686-w64-mingw32-g++.exe</code> 最好是绝对路径</p>
</blockquote>
<p>3、编译</p>
<pre><code>go build -ldflags "-s -w" -buildmode=c-shared -o main.dllmain.go
</code></pre>
<p>4、go语言demo</p>
<pre><code>package main

/*
#include &lt;stdlib.h&gt;
*/
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\\d{9})")
        result := reg.FindAllStringSubmatch(string(f), -1)
        if len(result) &gt;0 {
                if len(result)&gt;1{
                        out = C.CString(result[:19] + "/" + result)
                        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.dlldlldemo.go
func main() {
        //fmt.Println("-----------")
}
</code></pre>
<blockquote>
<p><code>/*#include &lt;stdlib.h&gt;*/</code> 注意上面的这个库,必须要导入,不然无法使用<code>C.free</code>释放内存。<br>
返回字符串的情况下:调用完go的函数之后,需要调用<code>C.free(unsafe.Pointer(out))</code>释放内存,否则会造成内存泄漏,程序崩溃。</p>
</blockquote>
<p>4、公开函数上面备注必须使用export开头</p>
<pre><code>//export PrintBye
</code></pre>
<p>5、易语言引用:库中对应名要以 <code>@ + 函数名</code>如:<code>@PrintBye</code></p>
<pre><code>.版本 2
.DLL命令 PrintBye, 文本型,
"main.dll",
"@PrintBye", 公开
</code></pre>
<p>cgo:设置环境变量<br>
url:https://blog.csdn.net/weixin_34021089/article/details/92112761?ops_request_misc=&amp;request_id=&amp;biz_id=102&amp;utm_term=cgo&amp;utm_medium=distribute.pc_search_result.none-task-blog-2<sub>all</sub>sobaiduweb~default-5-.nonecase&amp;spm=1018.2226.3001.4187</p><br><br>
来源:https://www.cnblogs.com/snyn/p/16253709.html
頁: [1]
查看完整版本: Go编译Dll