濮阳杆衣贸易有限公司

主頁 > 知識庫 > Golang 編譯成DLL文件的操作

Golang 編譯成DLL文件的操作

熱門標簽:壽光微信地圖標注 評價高的400電話辦理 阿克蘇地圖標注 外呼系統(tǒng)用什么卡 百度地圖標注后傳給手機 電話機器人軟件免費 涿州代理外呼系統(tǒng) 外呼系統(tǒng)顯本地手機號 excel地圖標注分布數(shù)據(jù)

首先撰寫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

在當前文件夾會生成兩個文件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;
}

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

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

您可能感興趣的文章:
  • Golang中switch語句和select語句的用法教程
  • golang調(diào)用c實現(xiàn)的dll接口細節(jié)分享
  • Golang如何調(diào)用windows下的dll動態(tài)庫中的函數(shù)
  • golang實踐-第三方包為私有庫的配置方案
  • 完美解決golang go get私有倉庫的問題
  • golang gopm get -g -v 無法獲取第三方庫的解決方案
  • Golang: 內(nèi)建容器的用法
  • golang switch語句的靈活寫法介紹

標簽:重慶 欽州 蘭州 雞西 汕頭 梅河口 銅川 吐魯番

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Golang 編譯成DLL文件的操作》,本文關(guān)鍵詞  Golang,編,譯成,DLL,文件,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang 編譯成DLL文件的操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang 編譯成DLL文件的操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    阿拉善左旗| 冀州市| 阳西县| 齐齐哈尔市| 竹山县| 铁岭市| 行唐县| 泸定县| 桂阳县| 太仆寺旗| 镇宁| 建阳市| 临洮县| 云霄县| 永善县| 沈阳市| 闸北区| 新余市| 安远县| 沾化县| 凤山市| 和龙市| 镇原县| 库伦旗| 资讯 | 屏东县| 左权县| 西丰县| 东乡县| 岳阳市| 庄河市| 攀枝花市| 汕尾市| 明溪县| 岗巴县| 九江市| 贵州省| 方山县| 来宾市| 康乐县| 澄城县|