繁体   English   中英

从单个* .cc *源文件生成多个* .oct *文件,以将C库连接到Octave

[英]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文件 - 至少不是从八度的角度来看。 这就是符号链接的用途 - 你有符号ABC吗? 制作指向该文件的A.octB.octC.oct符号链接,您可以使用它们,就好像每个只包含您关注的符号一样。

如果在单个oct文件中有多个函数定义,则使用autoload() 所以如果你有foo.oct它有函数foobar ,那你就做:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM