Golang结构体打包到SO库
我在尝试将Golang的结构体打包成SO库供C语言调用时遇到了问题。具体场景是:我在Go中定义了一个包含多个字段的结构体,使用//export标记了相关函数,并通过-buildmode=c-shared编译生成了SO文件。但在C语言中调用时,无法正确访问结构体成员,总是出现内存错误。想请教:
- Go结构体导出到SO库的正确方式是什么?
- 导出后的结构体在C中应该如何声明和使用?
- 是否需要特殊的字段类型转换或内存对齐处理?
- 有没有完整的示例可以参考?
2 回复
使用Golang将结构体打包为SO库,步骤如下:
- 导出函数需添加
//export注释 - 使用
-buildmode=c-shared编译 - 注意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 main和import "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库供其他语言调用。

