项目示例
C++ 生成so库
.
├── demo.cpp
├── demo.h
└── main.go
#ifndef DEMO_H
#define DEMO_H
typedef void(*callback_func)(int a, int b);
#ifdef __cplusplus
extern "C" {
#endif
void test_one(callback_func func, int a, int b);
#ifdef __cplusplus
}
#endif
#endif
#include "demo.h"
#include <stdio.h>
void test_one(callback_func func, int a, int b) {
printf("C func: a + b = %d\n", a + b);
func(a + b, b);
}
g++ -fPIC -shared -o libdemo.so demo.cpp
.
├── demo.cpp
├── demo.h
├── libdemo.so
└── main.go
编写 golang 代码
package main
import "C"
import (
"fmt"
"unsafe"
)
func goCallback(a C.int, b C.int) {
fmt.Println("go func: a + b = ", int(a) + int(b))
}
func main() {
C.test_one((C.callback_func)(unsafe.Pointer(C.goCallback)), C.int(10), C.int(20));
}
$ LD_LIBRARY_PATH=. go run main.go
C func: a + b = 30
go func: a + b = 50
参考
CGO 编程