Golang 编译成DLL文件的操作
作者:冷月醉雪 发布时间:2024-05-09 09:55:30
标签: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分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/lengyuezuixue/article/details/79360000


猜你喜欢
- numpy中有两个函数可以用来读取文件,主要是txt文件, 下面主要来介绍这两个函数的用法第一个是loadtxt, 其一般用法为numpy.
- 这篇文章主要介绍了python正则表达式匹配IP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- actions异步修改状态与mutations同步修改状态是两个容易混淆的概念,因为两者在执行上,很难测试出两者的差别,而我们要区别它们两,
- Python之Web框架Django项目搭建全过程IDE说明:Win7系统Python:3.5Django:1.10Pymysql:0.7.
- 1.什么是SQL语句sql语言:结构化的查询语言。(Structured Query Language),是关系数据库管理系统的标准语言。它
- 引言对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。1、膨胀(dilation)原理:一般对二
- Flask file upload代码import osfrom flask import Flask, request, re
- 这篇文章主要介绍了python读取ini配置文件过程示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 限制访问可以基于某种权限,某些检查或者为login视图提供不同的位置,这些实现方式大致相同。一般的方法是直接在视图的 request.use
- 一、心知天气API密钥获取首先,访问https://www.seniverse.com,进行登录或者注册操作,然后在控制台上创建一个免费版的
- /1 前言/最近酒店被曝出隐藏摄像头的事情屡见不鲜,搞得大家人心惶惶,有图为证,如下图所示。今天教大家一下如何用python分析出酒店里的针
- php判断正常访问和外部访问 <?php session_start(); if(isset($_POST['check
- Python3.5 版本引入了类型提示(Type Hints),它允许开发者在代码中显式地声明变量、函数、方法等的类型信息。这种类型声明不会
- 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删 除操作后在数据文件中留下碎片所致。Discuz! 在系统数设置
- 记录了mysql 8.0.12 的安装配置方法,分享给大家。一、安装1.从网上下载MySQL8.0.12版本,下载地址2. 下载完成后解压我
- 支持向量机常用于数据分类,也可以用于数据的回归预测1、Question?我们经常会遇到这样的问题,给你一些属于两个类别的数据(如子图1),需
- 简介Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的。2007年由4名Goo
- 问题描述MySQL 启动成功,使用 ps -ef |grep mysql 可以看到进程,如下图:也可以在服务器登陆,如下图:但是使用 net
- 本书状态你正在阅读的已经是本书的最终版。因此,只有当进行错误更正以及针对新版本Node.js的改动进行对应的修正时,才会进行更新。本书中的代
- MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Redu