欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 編譯成DLL文件的操作

 更新時間:2021年05月06日 10:04:10   作者:冷月醉雪  
這篇文章主要介紹了Golang 編譯成DLL文件的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

首先撰寫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兩個文件。

補充:Go1.10在編譯成dll小實例

看代碼吧~

package main
import (
    "net"
)
//必須導(dǎo)入
import "C"
//編譯成動態(tài)庫也是必須的
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)前文件夾會生成兩個文件net.dll net.h

下面是使用:

#include <stdio.h>
#include<stdlib.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;i<retlen;i++)
    {
        printf("%s\n", st[i].p);
    }
    free(slice.data);
    slice.data=NULL;
    return 0;
}

盡量不要用返回值來在C中處理,因為Go code不能在C分配的內(nèi)存中存儲指向Go分配的內(nèi)存的指針,這個很重要,不然你就會在使用過程中各種崩潰。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go語言并發(fā)編程 互斥鎖詳情

    Go語言并發(fā)編程 互斥鎖詳情

    在并發(fā)編程中,多個Goroutine訪問同一塊內(nèi)存資源時可能會出現(xiàn)競態(tài)條件,我們需要在臨界區(qū)中使用適當(dāng)?shù)耐讲僮鱽硪员苊飧倯B(tài)條件。Go 語言中提供了很多同步工具,本文將介紹互斥鎖Mutex和讀寫鎖RWMutex的使用方法。
    2021-10-10
  • Go語言編程中對文件讀寫的基本方法整理

    Go語言編程中對文件讀寫的基本方法整理

    這篇文章主要介紹了Go語言編程中對文件讀寫的基本方法整理,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 使用golang引入外部包的三種方式:go get, go module, vendor目錄

    使用golang引入外部包的三種方式:go get, go module, ve

    這篇文章主要介紹了使用golang引入外部包的三種方式:go get, go module, vendor目錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 一文徹底理解Golang閉包實現(xiàn)原理

    一文徹底理解Golang閉包實現(xiàn)原理

    閉包對于一個長期寫Java的開發(fā)者來說估計鮮有耳聞,光這名字感覺就有點"神秘莫測"。這篇文章的主要目的就是從編譯器的角度來分析閉包,徹底搞懂閉包的實現(xiàn)原理,需要的可以參考一下
    2022-10-10
  • Golang繼承模擬實例詳解

    Golang繼承模擬實例詳解

    這篇文章主要介紹了Golang繼承模擬方法,結(jié)合實例形式分析了Go語言實現(xiàn)繼承的原理與相關(guān)操作技巧,需要的朋友可以參考下
    2016-07-07
  • go?doudou開發(fā)gRPC服務(wù)快速上手實現(xiàn)詳解

    go?doudou開發(fā)gRPC服務(wù)快速上手實現(xiàn)詳解

    這篇文章主要為大家介紹了go?doudou開發(fā)gRPC服務(wù)快速上手實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Go語言有狀態(tài)goroutine的具體使用

    Go語言有狀態(tài)goroutine的具體使用

    Go語言中的有狀態(tài)goroutine提供了一種基于通信的并發(fā)狀態(tài)管理范式,通過將狀態(tài)的讀寫權(quán)限封裝在單個goroutine中,避免傳統(tǒng)互斥鎖的競爭問題,感興趣的可以了解一下
    2025-07-07
  • Go語言利用heap實現(xiàn)優(yōu)先級隊列

    Go語言利用heap實現(xiàn)優(yōu)先級隊列

    這篇文章主要為大家詳細介紹了Go語言中heap的使用以及如何利用heap實現(xiàn)優(yōu)先級隊列的相關(guān)資料,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Golang六個常用接口的使用總結(jié)

    Golang六個常用接口的使用總結(jié)

    在這篇文章中,小編來帶大家學(xué)習(xí)幾個Go標(biāo)準(zhǔn)庫的接口,看看Go標(biāo)準(zhǔn)庫是如何定義接口,以加深對Go語言接口的理解,感興趣的小伙伴快跟隨小編一起了解一下吧
    2023-07-07
  • Go語言中的格式化輸出占位符的用法詳解

    Go語言中的格式化輸出占位符的用法詳解

    在 Go 語言中,格式化輸出是一個非常常用的功能,特別是在處理字符串、數(shù)字和其他數(shù)據(jù)類型時,本文將詳細介紹 Go 語言中常用的格式化占位符及其用法,希望對大家有所幫助
    2024-10-10

最新評論