轻轻的 发表于 2018-9-20 06:14:13

golang调用动态库

  测试动态库
  test_so.h
  

int test_so_func(int a,int b);  

  test_so.c
  

#include "test_so.h"  

  
int test_so_func(int a,int b)
  
{
  
return a*b;
  
}
  

  生成so
  

gcc -shared ./test_so.c -o test_so.so  

  复制so文件到golang项目目录
  golang项目目录,建立
  load_so.h
  

int do_test_so_func(int a,int b);  

  load_so.c
  

#include "load_so.h"  
#include
  

  
int do_test_so_func(int a,int b)
  
{
  
void* handle;
  
typedef int (*FPTR)(int,int);
  

  
handle = dlopen("./test_so.so", 1);
  
FPTR fptr = (FPTR)dlsym(handle, "test_so_func");
  

  
int result = (*fptr)(a,b);
  
return result;
  
}
  

  test.go
  

package main  

  

/*  
#include "load_so.h"
  
#cgo LDFLAGS: -ldl
  

*/  
import
"C"  
import
"fmt"  

  
func main() {
  
fmt.Println(
"20*30=", C.do_test_so_func(20, 30))  
}
  

  编译运行即可。
  注:某大神在用go调用c的时候,掉到了某坑里,地址http://www.newjueqi.com/?p=106,结论为
  1./* */注释的代码下一行一定是import "C",中间不能有空行
  2.import "C"必须单独一行,不能和其它库一起导入


页: [1]
查看完整版本: golang调用动态库