1、首先定义一个C函数。
// 文件名为 libDemo.c
int Add(int a, int b)
{
return a + b;
}
2、使用GCC编译为静态库
gcc -c *.c
ar crv libDemo.a *.o
使用该命令生成libDemo.a静态库函数。同时准备头文件 libDemo.h。
// 文件名为 libDemo.h
#ifndef STATIC_LIB_H
#define STATIC_LIB_H
#ifdef __cplusplus
extern "C" {
#endif
int Add(int a, int b);
#ifdef __cplusplus
};
#endif
#endif //STATIC_LIB_H
3、编写需要在Octave调用的C函数接口。
// 函数名为 t96.cc
#include <octave/oct.h>
#include "libDemo.h"
DEFUN_DLD (t96, args, ,
"- Loadable Function: [PS, BX, BY, BZ] = t96 (PM, X, Y, Z) Returns the sum of PM in PS and X, Y, and Z in BX, BY, and BZ.")
{
octave_value_list retval;
const int dummy_integer = 0;
Matrix pm;
const double x = args(1).double_value(), y = args(2).double_value(),
z = args(3).double_value();
double ps, bx, by, bz;
pm = args(0).matrix_value ();
const double*pmarray = pm.fortran_vec();
for (int i = 1; i < 11; i++)
{
ps = ps + i;
}
bx = x;
by = y;
bz = Add(1,2);
retval(0) = octave_value (ps);
retval(1) = octave_value (bx);
retval(2) = octave_value (by);
retval(3) = octave_value (bz);
return retval;
}
4、把t96.cc、libDemo.a和libDemo.h拷贝到一个目录中。
启动Octaive软件,在命令行执行
mkoctfile -L. -lDemo t96.cc
待执行成功后,该目录下回生成 t96.oct 文件。
在Octave的命令行执行
[p, x, y, z] = t96 (1:10, sqrt (2), pi, e)
可以调用编译的t96函数,并输出期望的结果。
至此,Octave调用C或C++函数的基本流程完成。
如果需要链接动态库,编译执行为
gcc -shared -o libDemo.dll libDemo.c -Wl,--out-implib,libDemo.lib
此时,需要把libDemo.dll和libDemo.lib拷贝到t96.cc所在的目录中。后续执行mkoctfile命令不变。