Golang 编译成 dll/so 动态库 给其他语言调用[实列为 delphi调用]

站长
0 评论
/ /
262 阅读
/
1197 字
14 2024-05

最近在做一个桌面应用的东西 ,涉及到一个功能,(因为是桌面的有界面的程序我一般都会考虑用delphi)

但是其中涉及到一个功能 ,delphi没有现成的实现单元或者组件实现 ,

也不是一个简单的方法所以直接翻译过来这个选项放弃之。。

本来第一想到的是用惯了的c/c++ 但是顺带看了下go的实现包,哇简单哦。

以前一直知道,可以cgo成动态和静态调用的库。。。这次自己也小试一下吧。

 

首先在一定要import 一个c  如下代码

Go
/*
#include
#include
#include
*/
import "C"
然后是函数编写和导出 如下

Go
//export BuildResult
func BuildResult(key *C.char , input *C.char,output *C.char, outputsize C.size_t)
这里要注意的是 //export 这给时候的这个所谓的注释 就是意指 导出函数 后面更一个函数名称即可

入参转换到 go 的对应数据即可

比如 C.GoString(input) // 返回go的字符串

详细请仔细查阅 对照表

 

下完导出以后  就编译吧 使用下面命令生成 动态库

Bash
go build -ldflags "-s -w" -buildmode=c-shared -o libmdsu.dll main.go


最后就是调用端的部分了 下面是Delphi的

Pascal
procedure BuildResult(const key,input: PAnsiChar; Output: PAnsiChar; outputsize: Cardinal); cdecl;
implementation
{$IFDEF CPUX64}
const CLIb = 'libmdsu_x64.dll';
{$ELSE}
const CLIb = 'libmdsu_x86.dll';
{$ENDIF}

procedure BuildResult;external CLib;
end.
本文来自:Zelig[昏天暗地]原地址:https://zelig.cn/go-base/202109/37.html