• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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"
    )
    //必须导入
    import "C"
    //编译成动态库也是必须的
    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分配的内存中存储指向Go分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • Golang中switch语句和select语句的用法教程
    • golang调用c实现的dll接口细节分享
    • Golang如何调用windows下的dll动态库中的函数
    • golang实践-第三方包为私有库的配置方案
    • 完美解决golang go get私有仓库的问题
    • golang gopm get -g -v 无法获取第三方库的解决方案
    • Golang: 内建容器的用法
    • golang switch语句的灵活写法介绍
    上一篇:golang调用c实现的dll接口细节分享
    下一篇:Golang之sync.Pool使用详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang 编译成DLL文件的操作 Golang,编,译成,DLL,文件,的,