系统 Ubuntu18.04、go 1.16.10 、gcc 7.5.0
需要用go 调用matlab 写的算法,需要以下几个步骤
1 、matlab 转c
2、c转动态链接库
3、golang调用动态链接库
4、go调用动态链接库,用数组传参
1 matlab 转c
这个有很多人用过了,网上资料一大堆,可以参考下面的链接
https://blog.csdn.net/weixin_44982036/article/details/108657884
https://zhuanlan.zhihu.com/p/394729681
2 c转动态链接库
参考链接 http://www.zzvips.com/article/222935.html
1、写add.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char* Add(char* src, int n)
{
char str[20];
sprintf(str, "%d", n);
char *result = malloc(strlen(src)+strlen(str)+1);
strcpy(result, src);
strcat(result, str);
return result;
}
2、写add.h 头文件
#ifndef __ADD_H__
#define __ADD_H__
char* Add(char* src, int n);
#endif
3、 add.c、add.h 直接放到同一个文件夹下,用命令生成动态链接库libadd.so
gcc -fPIC -shared -o libadd.so add.c
3 go调用动态链接库
1 项目目录结构
demo1
├── include
│ └── add.c
│ └── add.h
├── lib
│ └── libadd.so
└── main.go
2 main.go
package main
/*
// 头文件的位置,相对于源文件是当前目录,所以是 .,头文件在多个目录时写多个 #cgo CFLAGS: ...
#cgo CFLAGS: -I./include
// 从哪里加载动态库,位置与文件名,-ladd 加载 libadd.so 文件
#cgo LDFLAGS: -L./lib -ladd -Wl,-rpath,lib
#include "add.h"
*/
import "C"
import "fmt"
func main() {
val := C.Add(C.CString("go"), 2021)
fmt.Println("run c: ", C.GoString(val))
}
以上就是一个可以运行的小案例
4 go调用动态链接库,用数组传参
参数为数组的时候要进行特殊处理,用到golang 的usafe 包,进行指针处理
1、deal.c 的deal 方法入参是个double 数组
2、deal.h
3、调用及输出结果