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>
#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分配的内存中存储指向Go分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃。

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

(0)

相关推荐

  • golang实践-第三方包为私有库的配置方案

    正常使用了go 1.8一段时间没有发现异常,为了发布便捷,以及后期引入plug-in,开始将大项目分解.涉及到通过vendor引入私有库保存的第三方包. 参考网上那些反复转帖的材料,始终无法成功,总是都会出现类似以下的错误: package git.oschina.net/xxx/yyy: unrecognized import path "git.oschina.net/xxx/yyy" (parse https://git.oschina.net/xxx/yyy?go-get=1:

  • Golang: 内建容器的用法

    1.数组 数组是值类型 [10]int 和 [20]int是不同类型 调用func(arr [10]int)会拷贝数组 在go语言中一般不直接使用数据 package main import "fmt" func updateArr(arr *[5]int) { arr[0] = 100 } func updateArrThroughSlice(arr []int) { arr[0] = 100 } func main() { //创建一个数据 var arr [5]int arr2

  • golang switch语句的灵活写法介绍

    switch是很容易理解的,先来个代码,运行起来 看看你的操作系统是什么吧 package main import ( "fmt" "runtime" ) func main() { fmt.Print("Go runs on ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") case "linux&quo

  • golang gopm get -g -v 无法获取第三方库的解决方案

    gopm get -g -v golang.org/x/text //网络不通 [GOPM] ?[36m03-14 07:36:49?[0m [?[31mERROR?[0m] golang.org/x/text: fail to make request: Get https://gopm.io/api/v1/revision?pkgname=golang.org/x/text: dial tcp: look up gopm.io: getaddrinfow: This is usually a

  • Golang中switch语句和select语句的用法教程

    本文主要给大家介绍了关于Golang中switch和select用法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 一.switch语句 switch语句提供了一个多分支条件执行的方法.每一个case可以携带一个表达式或一个类型说明符.前者又可被简称为case表达式.因此,Go语言的switch语句又分为表达式switch语句和类型switch语句. 1.表达式switch语句 var name string ... switch name { case "Golang"

  • Golang如何调用windows下的dll动态库中的函数

    使用syscall调用 package main import ( "fmt" "syscall" "time" "unsafe" ) const ( MB_OK = 0x00000000 MB_OKCANCEL = 0x00000001 MB_ABORTRETRYIGNORE = 0x00000002 MB_YESNOCANCEL = 0x00000003 MB_YESNO = 0x00000004 MB_RETRYCANC

  • golang调用c实现的dll接口细节分享

    目的 本篇文章主要介绍golang在调用c实现的dll时,具体的一些方式.比如值传递.参数传递.指针等等的一些使用. 一.dll的代码 c实现的dll代码: hello.h #ifndef _HELLO_H_ #define _HELLO_H_ #include <stdio.h> #define HELLO_EXPORTS #ifdef HELLO_EXPORTS #define EXPORTS_API extern "C" __declspec(dllexport) #

  • 完美解决golang go get私有仓库的问题

    解决golang go get gitlab私有仓库的问题(1.13) 1. 问题描述 require ( git.xxxxxxx.com/middle/user v0.0.1 ) go mod tidy 导入包失败 go get git.xxxxxxx.com/middle/user 失败 go build 有CHECKSUM过程,无法编译 2. 现象分析 go get 不支持代码支持之外的仓库.并且git 调用链过程采取了https 下载过程如果机器设置了GOPROXY,会导致下载失败 编译

  • 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

  • C#实现将javascript文件编译成dll文件的方法

    本文实例讲述了C#实现将javascript文件编译成dll文件的方法.分享给大家供大家参考,具体如下: 第一步:新建项目 添加js文件 写个测试Function (JScript.js) 单击JS文件属性.将 生成操作 改成嵌入的资源 第二步:在项目文件中添加一个类文件  该 类继承System.Web.UI.WebControl类 并重写控件预呈现的方法 代码如下: public class ClientScript:System.Web.UI.WebControls.WebControl

  • asp.net源程序编译为dll文件并调用的实现过程

    很多时候,我们需要将.cs文件单独编译成.dll文件,这就需要使用csc命令将.cs文件编译成.dll动态链接库文件.具体的操作步骤如下: 打开命令窗口->输入cmd到控制台->cd C:WINDOWSMicrosoft.NETFrameworkv1.1.4322 转到vs.net安装的该目录下->执行csc命令csc /target:library File.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:WINDOWSMicrosoft.NETFra

  • linux中把.c的文件编译成.so文件

    linux中共享库以so为后缀(shared object),与Windows下的DLL类似,是在程序运行时动态连接.多个进程可以连接同一个共享库. 以下以编译mylib.c为例讲如何编译.so文件. 首先,编译mylib.c: $gcc -c -fPIC -o mylib.o mylib.c -c表示只编译(compile),而不连接.-o选项用于说明输出(output)文件名.gcc将生成一个目标(object)文件mylib.o. 注意-fPIC选项.PIC指Position Indepe

  • Linux下将源文件编译成目标文件的过程解析

    简介 请讲一下linux如何源文件逐步编译成可执行文件. 解答 首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程. 以hello.c 程序为例 # include <stdio.h> main{ printf("hello\n"); } 一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成.s文件,再经过汇编器生成可重定位目标文件.o文件,再与其他.o文件经过链接器生成最终的可执行目标程序. 预处理阶段.主要是处理源文件中以"#"

  • Python编译成.so文件进行加密后调用的实现

    pyc的破解相对容易,使用cython将python文件编译成.so文件,能在一定程度上增强python源码的私密性. 编译成.so文件 环境准备:cython 测试脚本准备:test.py #-*-coding: UTF-8 -* - class test: def say(self): print 'hello' 脚本编译准备: 3.1 编写compile.py文件,内容如下: #-*-coding: UTF-8 -* - from distutils.core import setup f

  • 微信小程序 less文件编译成wxss文件实现办法

    less文件编译成微信小程序wxss文件 2016年9月21日,微信小程序正式开启内测.在微信生态下,触手可及.用完即走的微信小程序引起广泛关注,刷爆朋友圈子.在这样的火爆氛围中,作为一个前端开发者的我,也悄悄地去尝鲜. 在做demo小示例的过程中,我发现了一个极为让人为难的事儿:**如何让 less/sass 文件转成小程序的 wxss 文件**.</font> 对于基本不使用原生css,而习惯编写less的我,这个事儿让我的样式编写相当的吃力. 在尝试配置koala (一个可以编译less

  • 把js文件编译成dll供页面调用的方法

    1. 在解决方案中添加一个项目:JSControl 2. 在这个项目添加一个js文件(JScript1.js) 脚本的内容: function showAlert(){ alert('Today is a good dary'); } 3. 改变JScript1.js的属性,Build Action为Embedded Resource(嵌入的资源) 4. 在JSControl项目的AssemblyInfo.cs文件中添加一行:(注意JSControl.JScript1.js,JSControl是

  • c#下将.cs文件编译成dll

    调用方法:开始 >> 所有程序 >> Microsoft Visual Studio 2005 >> Visual Studio Tools >> Visual Studio 2005 命令提示 >>   打开后,输入csc/?查看编译选项.注意:要将命名空间也写进csc里啊. /out:<file> 输出文件名(默认值:   包含主类的文件或第一个文件的基名称)    /target:exe 生成控制台可执行文件(默认)   (缩写

  • 如何把ASP编写成DLL

    这篇文章主要是把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护自己的代码. 下面,我们会来编写一个非常简单的组件,重点是知道怎样开发DLL组件,而不是其复杂的代码!这些都要靠你们自己以后的努力了. 服务器端组件 首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器. 当IIS被请求执行一个ASP程序,

随机推荐