Go编译DLL与SO

golang 程序转换为so文件的方法 阅读详情

1. 简介

将Go编译成DLL/SO供其他语言调用。

  • .DLL:文件是 Windows 操作系统的动态链接库文件。
  • .SO 文件是 Unix、Linux 和其他类 Unix 系统的共享库文件。

2. Go编译DLL/SO

注意

  1. export后面导出的方法名一定要大写。
package main

/*
#include <stdlib.h>
*/
import "C"
import "strings"

//export Sum
func Sum(a, b C.int) C.int {
	return a + b
}

//export ToLower
func ToLower(c *C.char) *C.char {
	s := C.GoString(c)
	return C.CString(strings.ToLower(s))
}

func main() {
}

编译成SO

go build -buildmode=c-shared -o example.so

编译成DLL

go build -buildmode=c-shared -o example.dll

3. Python调用DLL/SO

调用SO

import ctypes
from ctypes import cdll

example = cdll.LoadLibrary('./example.so')
print(example.Sum(1, 2))  # 3

to_lower = example.ToLower
to_lower.argtypes = [ctypes.c_char_p]
to_lower.restype = ctypes.c_char_p
print(to_lower(b'HELLO WORLD'))  # b'hello world'

调用DLL(未测试)

import ctypes

example = ctypes.CDLL("./example.so")

print(example.Sum(1, 2))  # 3

to_lower = example.ToLower
to_lower.argtypes = [ctypes.c_char_p]
to_lower.restype = ctypes.c_char_p
print(to_lower(b'HELLO WORLD'))  # b'hello world'
python 调用go编译的dll,so 内存泄露问题 用ctypes 调用编译好的dll/so,直接返回cstring出现内存泄露,defer unfree只适用于不返回时候用,有返回结果不能直接返回string bytes,应该先返回地址,然后解析地址中的值,再在调用的go程序中用free方式,把地址释放,下面是代码:go文件的代码: python中代码:...... 阅读详情

相关推荐

golang 调用 c++动态库(win、linux环境)

在生产时,经常会使用golang调用已有的c++库,以下分别演示在linux 跟 windows开发环境下怎样加载动态库。 linux下的动态库为.so文件、win动态库为.dll文件 test.cpp 生成 test.so(linux)、 test.dll(win) #ifdef _WINDOWS #else #define WINAPI extern "C" WINAPI int testFunc() { return 0; } linux开发环境 demo.go package main i

BBinChina的专栏 1800

Golang 编译生成 DLL 文件

1、注释 //export PrintBye 和 //export Sum 在编译 DLL 的时候是必须的,说明了 DLL 需要输出的函数。注意注释和下面的函数名之间不能有空行。2、函数 main 也是必不可少的,但是不知道是否能够用它来做 DLL 的初始化,这个以后再仔细研究。python通过调用步骤3中生成的go2python.dll,实现对go的调用。编译生成 go2python.dll 和 go2python.h 两个文件。3、go脚本文件名,不能命名为xxx_test.go。

如有侵权,请联系作者删除 7893

AI Agent在智能投研中的实战:多智能体信息整合与策略生成

那么,什么是AI Agent?简单来说,AI Agent是一种能够感知环境、做出决策并采取行动的自主系统。自主性:能够在没有人类直接干预的情况下运行,对自己的行为和内部状态有一定的控制权。反应性:能够感知环境的变化,并及时做出反应。主动性:不仅能够对环境变化做出反应,还能够主动地设定目标并采取行动实现这些目标。社会性:能够与其他Agent(包括人类和人工智能)进行交互、协作和竞争。它们可以全天候不间断地监控和处理海量信息,大大提升信息处理能力;

AI大模型应用之禅 188

golang 编译为dll 的方法

Golang封装成dll可以吗?要怎么做 Golang可以将程序编译成DLL文件,具体做法如下: 1、golang 编译 dll 过程中需要用到 gcc,所以先安装 MinGW。 windows 64 位系统应下载 MinGW 的 64 位版本: https://sourceforge.net/projects/mingw-w64/ 2、下载后运行 mingw-w64-install.exe,完成 MingGW 的安装。 3、首先撰写 golang 程序 exportgo.go: packag

dodod2012的专栏 5279

✨使用 vLLM + Docker 部署 Qwen3-Embedding-8B 并实现高效文本向量生成(附 `curl` 测试)

本文介绍了如何使用 vLLM 和 Docker 部署 Qwen3-Embedding-8B 嵌入模型服务,并通过标准 OpenAI 兼容接口进行调用和结果解析。如果你在部署中遇到任何问题,欢迎留言讨论!

用大模型重构生活:猫奴程序员的AI智能日常记录 6238

Vivado安装教程:多版本共存的配置技巧

详解Vivado安装教程中的多版本共存配置技巧,帮助用户在同一系统中管理不同版本的Vivado开发环境,提升开发效率与兼容性,适用于需要切换版本的FPGA开发者。

weixin_35257663的博客 1774

go语言生成DLL,供其他语言调用

官网下载地址是 https://sourceforge.net/projects/mingw-w64/注意:需要 gcc 的支持,Windows 环境下的 gcc 系统是 MinGW。一、go语言编写DLL(函数参数是字符串,输出是字符串或数值)3、字符类型处理起来非常繁琐;三、使用VS2019加载 file.dll。go语言生成DLL,供其他语言调用。

RZTUSHU1的博客 2572

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3902

java 调用golang_Java调用Golang生成的动态库(dll,so)

0x01. 环境准备A. GCC在控制台中输入gcc -v如果提示命令未找到,那么说明你的计算机中还没有gcc,去安装一个吧,gcc官方网站:https://gcc.gnu.org/如果从来没有安装过gcc的朋友可以直接安装win-build,可以帮你快速的安装官方网站:http://mingw-w64.org/doku.php/download/win-builds0x02. 编写go程序我们这...

weixin_42393198的博客 927

告别Inspect!用微软官方推荐的Accessibility Insights搞定WinApp自动化测试元素定位

本文介绍了如何从传统的Inspect工具升级到微软官方推荐的Accessibility Insights for Windows,以提升Windows应用自动化测试中的元素定位效率。通过详细的功能对比、安装指南和实战技巧,帮助测试工程师掌握这款现代化工具的核心优势,包括实时元素检测、属性筛选和与WinAppDriver、Appium等测试框架的无缝集成。

weixin_26749245的博客 618

仿真学习系列(四十三):Sigrity仿真之平面谐振分析

在 SIGRITY 中,平面谐振分析(Plane Resonance Analysis)是一种用于分析信号完整性(SI)问题的高级仿真方法,尤其关注于层间电磁波的传播、谐振现象和信号衰减等问题。平面谐振分析通常用于电源分配网络(PDN)、信号线和参考平面之间的相互作用。本文将详细介绍如何在 SIGRITY 中进行平面谐振分析,并提供一些实用的分析方法与步骤,帮助工程师们识别和优化可能存在的设计问题。

案例文章,高速信号 478

golang调用java_Java调用Golang生成的动态库(dll,so)

0x01. 环境准备A. GCC在控制台中输入gcc -v如果提示命令未找到,那么说明你的计算机中还没有gcc,去安装一个吧,gcc官方网站:https://gcc.gnu.org/如果从来没有安装过gcc的朋友可以直接安装win-build,可以帮你快速的安装官方网站:http://mingw-w64.org/doku.php/download/win-builds0x02. 编写go程序我们这...

weixin_36264801的博客 688

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

Java使用JNA调用Golang编译生成的动态库(dll 和 so 文件)

参考文档: JNA的官方文档:http://java-native-access.github.io/jna/5.5.0/javadoc/ JNA的github:https://github.com/java-native-access/jna github的一个case:Calling Go Functions from Other Languages using C Shared Lib...

carl95271的博客 6343

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

cgo 编译命令

将go 代码编译为dll命令 go build -buildmode=c-shared -o exportgo.dll exportgo.go

星星点灯的博客 1027

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go打包dll总结,stdcall打包dll妙招

package main //export Addfunc Add(a int, b int) int { return a + b} func main() { // 这里的代码仅用于编译生成C可调用的库}String InData = “{“data”:{“operatorId”:“test001”,“operatorName”:“超级管理员”,“orgId”:“123”},“orgId”:“1232”}”;-----------第一步:打包go 中函数 ---------

debuk的博客 642

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

faster python之ctypes调用so/dll

ctypes提供cast()方法将一个ctypes实例转换为指向另一个ctypes数据类型的指针,cast()接受两个参数,一个是ctypes对象,它是或可以转换成某种类型的指针,另一个是ctypes指针类型。Go编译器支持将Go代码编译成可执行文件,静态库(.a文件)和共享对象文件(.so文件或.dll文件),这使得Go可以用于构建独立的应用程序,也可以用于构建共享库,供其他程序使用。是一个动态的Python库,所以在性能要求严格的情况下,可能需要考虑使用更高级的工具,如Cython或SWIG。

General_zy的博客 1624

go语言疑问

go语言疑问1、在widnows环境下build太慢2、如何编译出动态链接库(.dll,.so)3、编译出的文件太大 转载于:https://www.cnblogs.com/vc60er/archive/2013/04/09/3010471.html...

afdd28617的博客 122

python调用go语言的代码

最近在学习上述Python,go语言,研究下互相调用的事项,在windows下使用。

wtt234的专栏 2329

Python 调用GO 动态库

因为python的AES加密结果和Go的加密结果总是对不上,最终只能让开发提供一个Go的加密库,用python来调用,保证加密结果是一样的。 Go生成动态库的的搞法开发知道,就不写啦 此处仅记录python 调用方式: Go 动态库接收和返回的其实是C_type格式,所以python调用也需要转换为相应的C_type格式,可参照此表转换 if __name__ == "__main__": lib = cdll.LoadLibrary("C:\\Users\\ws\\Downlo.

waiting alone的博客 1274

PrITTI配置文件详解:深入理解LVAEDecoderWrapper参数设置

PrITTI(HuggingFace镜像 / raniatze / pritti-checkpoints)是一个基于深度学习的模型检查点项目,其核心组件LVAEDecoderWrapper的配置参数直接影响模型性能和输出效果。本文将系统解析该配置文件的关键参数,帮助新手用户快速掌握参数含义与调整方法。 ## 配置文件基础结构 LVAEDecoderWrapper的配置文件位于项目目录下的`ld

gitblog_00425的博客 855

golang编译ARM环境下的SO库文件

3. 设置GO 编译环境变量:CGO_ENABLED=1 GOOS=windows GOARCH=arm64 CGO_CFLAGS=‘-O3 -Wall -Wno-unused-function -Wno-switch -std=gnu11 -DWINVER=0x0601’ CC=【上面arm gcc安装路径】1.下载MSYS2(https://www.msys2.org/wiki/arm64/)

github_37941957的博客 836

Java调用Go生成的动态库(DLL,SO)

java 调用 golang编译的dll so

掘金者说 1238

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

cl9Zf7o0j的博客 174

Go语言的plugin包与动态链接库在运行时扩展中的加载机制

这一过程类似于C语言的dlopen机制,但Go通过类型安全的方式确保插件与主程序之间的交互符合Go的类型系统要求。plugin包的引入为Go程序提供了动态加载代码的能力,使得开发者可以在不重新编译主程序的情况下扩展功能。一旦插件被加载,其占用的内存无法被显式释放,因为Go的垃圾回收机制无法完全卸载动态库中的代码。在实际应用中,建议采用长生命周期的插件加载策略,避免动态库的反复加载和卸载。通过以上分析,可以看出Go的plugin包为运行时扩展提供了强大的支持,但也存在一定的局限性。

lgtfim_218的博客 172
上一篇: Go Barrier栅栏
下一篇: HTTP跨域
yimtcode
博客等级 码龄6年 205粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值