首先撰寫(xiě)golang程序exportgo.go:
package main
import "C"
import "fmt"
//export PrintBye
func PrintBye() {
fmt.Println("From DLL: Bye!")
}
//export Sum
func Sum(a int, b int) int {
return a + b;
}
func main() {
// Need a main function to make CGO compile package as C shared library
}
編譯成 DLL 文件:
go build -buildmode=c-shared -o exportgo.dll exportgo.go
編譯后得到 exportgo.dll 和 exportgo.h兩個(gè)文件。
補(bǔ)充:Go1.10在編譯成dll小實(shí)例
看代碼吧~
package main
import (
"net"
)
//必須導(dǎo)入
import "C"
//編譯成動(dòng)態(tài)庫(kù)也是必須的
func main() {}
//export Interfaces
func Interfaces(list []string, retlen *int) string {
interf, err := net.InterfaceAddrs()
if err != nil {
return err.Error()
}
for i, v := range interf {
if i >= len(list) {
break
}
list[i] = v.String()
}
*retlen = len(list)
return ""
}
編譯命令:
go build -ldflags "-s -w" -buildmode=c-shared -o net.dll main.go
在當(dāng)前文件夾會(huì)生成兩個(gè)文件net.dll net.h
下面是使用:
#include stdio.h>
#includestdlib.h>
#include string.h>
#include "net.h"
int main()
{
GoString ret;
GoSlice slice;
slice.len=10;
slice.cap=0;
slice.data=calloc(10,sizeof(GoString));
GoInt retlen=0;
ret=Interfaces(slice,retlen);
if (ret.n != 0)
{
char* retc = calloc(ret.n+1,sizeof(char));
memcpy(retc,ret.p,ret.n);
printf("Return value:%s\n", retc);
free(retc);
retc=NULL;
}
GoString* st=(GoString*)(slice.data);
for (int i=0;iretlen;i++)
{
printf("%s\n", st[i].p);
}
free(slice.data);
slice.data=NULL;
return 0;
}
盡量不要用返回值來(lái)在C中處理,因?yàn)镚o code不能在C分配的內(nèi)存中存儲(chǔ)指向Go分配的內(nèi)存的指針,這個(gè)很重要,不然你就會(huì)在使用過(guò)程中各種崩潰。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- Golang中switch語(yǔ)句和select語(yǔ)句的用法教程
- golang調(diào)用c實(shí)現(xiàn)的dll接口細(xì)節(jié)分享
- Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)
- golang實(shí)踐-第三方包為私有庫(kù)的配置方案
- 完美解決golang go get私有倉(cāng)庫(kù)的問(wèn)題
- golang gopm get -g -v 無(wú)法獲取第三方庫(kù)的解決方案
- Golang: 內(nèi)建容器的用法
- golang switch語(yǔ)句的靈活寫(xiě)法介紹