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的一个名为 的"包"。

/** 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

 

posted @ 2025-04-22 15:18  suntroop  阅读(311)  评论(0)    收藏  举报