赞
踩
.
├── 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
package main /* #cgo CFLAGS: -I. #cgo LDFLAGS: -L. -ldemo #include "demo.h" // 因为so库要调用golang导出的函数,传递golang函数以后 // so库函数指针指向了这个golang函数,需要去链接,因为 // 在so库外部定义的,所以要加extern关键字 extern void goCallback(int, int); */ import "C" import ( "fmt" "unsafe" ) //export goCallback func goCallback(a C.int, b C.int) { // Go回调函数 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。