[英]Generating multiple *.oct* files from a single *.cc* source file to interface a C library to Octave
我有一个我想在Octave中使用的C库。 在本教程之后 ,它似乎很简单:用C ++包装函数然后mkoct文件 。 问题是:如果我想在单个源文件中有多个函数定义(包装器)怎么办?
在上面提到的教程中说明了这一点
应该注意的是,在源文件中具有多个DEFUN_DLD函数是完全可以接受的。 但是,对于使用DEFUN_DLD宏的源代码中定义的每个函数,必须有一个指向oct文件的符号链接,或者应该使用自动加载( 函数文件 )函数。
然后在提供的链接中:
一旦Octave找到一个名称匹配的文件(被调用的函数),就会读取该文件的内容。 如果它定义了单个函数,则编译并执行它。 有关如何在单个文件中定义多个函数的详细信息,请参阅脚本文件。
在第二个链接中,没有关于如何加载包含多个函数的.oct文件或如何从单个源文件生成多个.oct文件的信息。 根据我的理解,后者是正确的方法。 我怎样才能做到这一点?
第二个链接的要点是你没有加载一个包含多个函数的.oct文件 - 至少不是从八度的角度来看。 这就是符号链接的用途 - 你有符号A
, B
和C
吗? 制作指向该文件的A.oct
, B.oct
和C.oct
符号链接,您可以使用它们,就好像每个只包含您关注的符号一样。
如果在单个oct文件中有多个函数定义,则使用autoload()
。 所以如果你有foo.oct
它有函数foo
和bar
,那你就做:
autoload ("bar", "path-to-foo.oct");
我将首先澄清你问题中的第二个引用窗口。 这并不是指.oct定义的函数。 这意味着规范的m文件定义函数与直接在控制台中定义的“现场”函数或作为脚本的一部分之间的区别。
至于第一个引用窗口,当涉及到.oct文件中定义的函数时,情况就不同了。 它的含义是您可以创建一个定义许多函数的.oct文件,但是为了调用这些函数,需要在路径中使用相同名称的文件 。 因此,如果.oct文件定义函数“foo”和“bar”,则需要有一个名为“foo.oct”的.oct文件副本,另一个(或者,更现实地,作为原始符号链接)重命名作为“bar.oct”。
类似地,您还可以在工作区中定义“foo.m”和“bar.m”文件,该文件仅包含这些函数的文档,这样如果您执行“help foo”或“help bar”,您将获得预定的文件。
或者,您可以使用自动加载 ,就像carandraug建议的那样。
生成C到Octave接口的另一种可能性是使用SWIG ,它可以生成包含所有功能的单个.oct文件。 使用指针和数组时请参阅此处 。
这是一个例子:
头
/* File: example.h */
int fact(int n);
int fact2(int n1, int n2);
void add(int *x, int *y, int *r);
资源
/* File: example.c */
#include "example.h"
int fact(int n) {
if (n < 0){ /* This should probably return an error, but this is simpler */
return 0;
}
if (n == 0) {
return 1;
}
else {
/* testing for overflow would be a good idea here */
return n * fact(n-1);
}
}
int fact2(int n1, int n2) {
return fact(n1)*fact(n2);
}
void add(int *x, int *y, int *r) {
*r = *x + *y;
}
接口
/* File example.i */
%module swigexample
%include "cpointer.i"
%{
#include "example.h"
%}
%pointer_functions(int, intp)
%include "example.h"
编
swig -octave -o swigexample.cpp example.i
mkoctfile -I. -I/usr/include/octave-4.2.2/ -Iswiglib swigexample.cpp example.c
测试
% File test.m
swigexample;
fact(5)
fact2(4,4)
% ==============
a = new_intp();
intp_assign(a, 37);
b = new_intp();
intp_assign(b, 22);
c = new_intp();
add(a,b,c);
r = intp_value(c);
delete_intp(a);
delete_intp(b);
delete_intp(c);
r
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.