go在通过cgo使用dlopen调用.so中的函数是如何使用的,请给出具体代码例子
时间: 2024-09-06 19:02:42 浏览: 71
在Go语言中,通过cgo可以使用dlopen调用.so文件中的函数。以下是一个简单的示例:
1. 首先,创建一个名为`example.h`的头文件,其中包含要在C代码中使用的函数声明:
```c
// example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
int add(int a, int b);
#endif
```
2. 然后,创建一个名为`example.c`的C源文件,实现在`example.h`中声明的函数:
```c
// example.c
#include "example.h"
int add(int a, int b) {
return a + b;
}
```
3. 编译C代码为共享库:
```bash
gcc -shared -o libexample.so example.c
```
4. 创建一个名为`main.go`的Go文件,使用cgo调用`libexample.so`中的`add`函数:
```go
// main.go
package main
/*
#include <stdio.h>
#include "example.h"
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
// 加载共享库
lib := C.dlopen("libexample.so", C.RTLD_LAZY)
if lib == nil {
panic("无法加载共享库")
}
defer C.dlclose(lib)
// 获取add函数的地址
addFunc := C.dlsym(lib, C.CString("add"))
if addFunc == nil {
panic("无法找到add函数")
}
// 定义add函数类型
type AddFunc func(a, b int) int
add := AddFunc(uintptr(unsafe.Pointer(addFunc)))
// 调用add函数
result := add(3, 4)
fmt.Println("3 + 4 =", result)
}
```
5. 最后,使用以下命令编译并运行Go程序:
```bash
go build -o main main.go
./main
```
输出结果应为:
```
3 + 4 = 7
```
阅读全文