Golang中共享库的使用与实现

Golang中共享库的使用与实现 我正在尝试使用以下命令在 Go 中创建一个共享库(libname.so): go build -buildmode c-shared -o testlib.so test.go,其中 test.go 包含以下代码:

package main
import “C”
type person struct {
name string
age  int
}
//export newPerson
func newPerson(name string) *person {
p := person{name: name}
p.age = 42

    return &p
}
func main(){}

它给出了一个错误:“Go type not supported in export: struct”。

有人能帮忙吗?


更多关于Golang中共享库的使用与实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

更多关于Golang中共享库的使用与实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是否意味着我无法在Go语言中创建一个共享库,该库的函数可以接受任何结构体作为参数?

如果是这样,那么未来会支持这个功能吗?

在Go中导出结构体到C共享库时,需要遵循特定的规则。错误“Go type not supported in export: struct”是因为直接导出的函数不能返回Go结构体指针到C代码中。你需要使用C类型来包装数据。

以下是修正后的示例:

package main

import "C"
import "unsafe"

// 使用C兼容的类型定义
type person struct {
    name *C.char
    age  C.int
}

//export newPerson
func newPerson(name *C.char) unsafe.Pointer {
    p := &person{
        name: C.CString(C.GoString(name)),
        age:  C.int(42),
    }
    return unsafe.Pointer(p)
}

//export getPersonAge
func getPersonAge(p unsafe.Pointer) C.int {
    return ((*person)(p)).age
}

//export freePerson
func freePerson(p unsafe.Pointer) {
    personPtr := (*person)(p)
    C.free(unsafe.Pointer(personPtr.name))
}

func main() {}

编译命令:

go build -buildmode=c-shared -o testlib.so test.go

对应的C头文件会包含:

typedef void* Person;

extern Person newPerson(char* name);
extern int getPersonAge(Person p);
extern void freePerson(Person p);

使用示例(C代码):

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

int main() {
    Person p = newPerson("John");
    printf("Age: %d\n", getPersonAge(p));
    freePerson(p);
    return 0;
}

关键点:

  1. 使用unsafe.Pointer作为C可识别的通用指针类型
  2. 字符串需要通过C.CString()转换并手动管理内存
  3. 所有导出的函数参数和返回值必须是C兼容类型
  4. 需要显式提供内存释放函数

注意:使用unsafe.Pointer需要确保类型安全,避免内存泄漏。

回到顶部