Go 语言的动态链接库(dll/so/dylib)创建和使用:
参考链接:https://www.cnblogs.com/Kingram/p/12088087.html
在Go语言中,可以使用 CGO 来创建动态链接库(DLL)。CGO是Go语言提供的一个工具,可以将Go代码与C语言代码进行交互。下面是创建DLL文件的步骤:
步骤1:编写Go代码
首先,编写一个包含需要导出的函数的Go代码文件。例如,我们创建一个名为"example.go"的文件,其中包含一个名为"Add"的函数。
在Go语言中,可以使用CGO的 //export 注释来导出函数,以便在DLL中使用。注意,导出的函数必须是公开的(首字母大写),否则无法在DLL中访问。
import "C", import的一个名为 C 的"包"。
/** go build -o example.dll -buildmode=c-shared example.go **/ package main /* #include <stdint.h> // C结构体定义:User typedef struct { int32_t id; char name[50]; } User; // C函数声明:PrintUser void PrintUser(User user); */ import "C" import "fmt" //export Add func Add(a, b int) int { return a + b } // Go结构体定义:User type User struct { ID int32 Name string } //export PrintUser func PrintUser(user C.User) { fmt.Printf("User ID: %d, Name: %s\n", user.id, C.GoString(&user.name[0])) } func main() { // main函数在DLL中通常不会被调用 }
步骤2:生成C头文件
接下来,需要使用 CGO 生成一个C头文件,以便在C代码中使用Go函数。使用以下命令生成头文件:
Windows 平台:
go build -o example.dll -buildmode=c-shared example.go
Linux 平台:
go build -o example.so -buildmode=c-shared example.go
这将生成名为 "example.h" 的头文件。
步骤3:编写C代码
现在,我们可以编写一个使用Go函数的C代码文件。创建一个名为" main.c "的文件,并包含刚刚生成的头文件。
/** gcc -o main main.c ./example.dll **/ #include <stdio.h> #include <stdint.h> #include "example.h" /* Start of preamble from import "C" comments. #line 4 "example.go" #include <stdint.h> // C结构体定义:User typedef struct { int32_t id; char name[50]; } User; // C函数声明:PrintUser void PrintUser(User user); #line 1 "cgo-generated-wrapper" End of preamble from import "C" comments. */ int main() { int result = Add(2, 3); printf("Result: %d\n", result); User user = {1, "Alice"}; PrintUser(user); return 0; }
步骤4:编译C代码
最后,使用C编译器编译C代码文件,链接Go动态链接库,并生成可执行文件。
gcc -o main main.c ./example.dll //或者Linux平台 example.so
现在,你可以运行生成的可执行文件,它将调用Go函数并打印结果。
E:\workForGo> main.exe Result: 5 User ID: 1, Name: Alice
浙公网安备 33010602011771号