Golang編寫Windows動態鏈接庫(DLL)及C調用范例


一、准備。

1、GoLang在1.10版本之后開始支持編譯windows動態鏈接庫,可以打開命令行工具使用go version 查看自己的go版本。

2、你的電腦上需要gcc,如果沒有的話[點擊這里]下載安裝,或者問度娘如何下載gcc,有的方法很慢,這是我折騰半天用的最快的方法,下載壓縮包解壓即可。

 

如果有32位版本的需要卸載重裝這個64位的,這個很重要。

 

裝完環境配置一下bin目錄到環境變量中,打開命令行工具,輸入gcc -v,如果出現以下信息,則配置成功:

 

二、編譯。

1、命令很簡單,就一行

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

-s 、-w 指令用於減小動態鏈接庫的體積,-s是壓縮,-w是去掉調試信息。-o可以指定生成文件的目錄。命令可以簡化成如下:

> go build -o main.dll -buildmode=c-shared main.go

這句命令執行結束后會在當前目錄下生成一個.dll和一個.h文件,至此,編譯部分就完成了。

 

 三 、C調用示例。

1、編寫lib.go,這里有兩個地方需要注意:

(1)import "C"必須加上,編譯需要C庫的支持,方便類型轉換

(2)//export GetData必須加上,指明該函數導出,而且必須是//export+ 空格+函數名,//和export之間加上空格也不行。

以上條件不滿足編譯不出.h文件。

 

 2、編譯,編譯成功后目錄下會多出一個.dll和.h文件

 

 

 

3、C語言調用

方法是:用 LoadLibrary 函數加載動態鏈接庫到內存,用 GetProcAddress函數動態獲得 DLL 函數的入口地址。當一個 DLL 文件用 LoadLibrary 顯式加載后,在任何時刻均可以通過調用 FreeLibrary 函數顯式地從內存中卸載。

[注意]:每調用一次 LoadLibrary 函數就應調用一次 FreeLibrary 函數,以保證不會有多余的庫模塊在應用程序結束后仍留在內存中,否則導致內存泄漏。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM