主页 > 知识库 > Golang 编译成DLL文件的操作

Golang 编译成DLL文件的操作

热门标签:寿光微信地图标注 评价高的400电话办理 阿克苏地图标注 外呼系统用什么卡 百度地图标注后传给手机 电话机器人软件免费 涿州代理外呼系统 外呼系统显本地手机号 excel地图标注分布数据

首先撰写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 编译成DLL文件的操作》,本文关键词  Golang,编,译成,DLL,文件,的,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《Golang 编译成DLL文件的操作》相关的同类信息!
  • 本页收集关于Golang 编译成DLL文件的操作的相关信息资讯供网民参考!
  • 推荐文章