Golang结构体打包到SO库

我在尝试将Golang的结构体打包成SO库供C语言调用时遇到了问题。具体场景是:我在Go中定义了一个包含多个字段的结构体,使用//export标记了相关函数,并通过-buildmode=c-shared编译生成了SO文件。但在C语言中调用时,无法正确访问结构体成员,总是出现内存错误。想请教:

  1. Go结构体导出到SO库的正确方式是什么?
  2. 导出后的结构体在C中应该如何声明和使用?
  3. 是否需要特殊的字段类型转换或内存对齐处理?
  4. 有没有完整的示例可以参考?
2 回复

使用Golang将结构体打包为SO库,步骤如下:

  1. 导出函数需添加//export注释
  2. 使用-buildmode=c-shared编译
  3. 注意C与Go类型转换

示例:

package main

import "C"

//export GetData
func GetData() *C.char {
    return C.CString("Hello from Go")
}

func main() {}

编译:

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

更多关于Golang结构体打包到SO库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要将Golang结构体打包到共享库(SO),可以使用Go的CGO和-buildmode=c-shared编译选项。以下是具体步骤:

1. 编写Go代码

创建一个Go文件(如main.go),使用//export指令导出函数,并确保包含package mainimport "C"

示例代码:

package main

import "C"

//export GetPerson
func GetPerson() *C.char {
    person := struct {
        Name string
        Age  int
    }{
        Name: "Alice",
        Age:  30,
    }
    // 将结构体转换为JSON字符串返回(需处理错误)
    return C.CString(`{"Name":"Alice","Age":30}`)
}

func main() {} // 必需的空main函数

2. 编译为SO库

运行命令生成共享库:

go build -buildmode=c-shared -o libperson.so main.go

这会生成libperson.so和头文件libperson.h

3. 从C/C++调用

在C代码中包含生成的头文件,并链接SO库:

#include <stdio.h>
#include "libperson.h"

int main() {
    char* person = GetPerson();
    printf("Person: %s\n", person);
    FreePerson(person); // 如果导出了解放内存函数
    return 0;
}

编译C代码(示例):

gcc -o test test.c -L. -lperson

注意事项:

  • 类型转换:Go结构体需序列化(如JSON)传递给C,因C无法直接访问Go结构体。
  • 内存管理:使用C.CString分配的内存需在C中释放(通过导出Free函数)。
  • 限制:Go的GC可能影响长期运行的C引用,需避免指针跨语言长期持有。

通过以上步骤,即可将Go结构体功能封装到SO库供其他语言调用。

回到顶部