使用SWIG创建Octave文件

时间:2011-05-04 17:35:20

标签: c swig octave

我正在尝试使用SWIG创建Octave函数。但即使是最基本的示例代码似乎也失败了,我甚至没有机会将它变成八度音阶。我不确定是否应该关注swig为C ++源文件(.cxx)创建的扩展类型,它生成的 mkoctfile 无法识别(它只需要.C .cpp .cc,这似乎是为了让swig搞得那么多,并且创建了它不支持的C ++的ONE扩展。

非常感谢有这方面经验的人的帮助!

我所做的步骤如下:

swig -octave swig_test.i
mv swig_test_wrap.cxx swig_test_wrap.cpp <--- This is necessary because mkoctfile doesn't recognize the cxx type c++ code that swig generates
mkoctfile swig_test_wrap.cpp

这会导致4个错误:

swig_test_wrap.cpp:1449:24: error: invalid covariant return type for 'virtual Octave_map octave_swig_type::map_value() const'
/usr/include/octave-3.4.0/octave/../octave/ov-base.h:560:22: error:   overriding 'virtual octave_map octave_base_value::map_value() const'
swig_test_wrap.cpp:1657:24: error: invalid covariant return type for 'virtual Octave_map octave_swig_ref::map_value() const'
/usr/include/octave-3.4.0/octave/../octave/ov-base.h:560:22: error:   overriding 'virtual octave_map octave_base_value::map_value() const'

我非常基本的 swig_test.c

的源代码
int fact(int n) {
  if (n <= 1) return 1;
  else return n*fact(n-1);
}

int my_mod(int x, int y) {
   return (x%y);
}

然后我的包装器接口文件的代码 swig_test.i

%module swig_test
%{
  extern int fact(int n);
  extern int my_mod(int x, int y);
%}

 extern int fact(int n);
 extern int my_mod(int x, int y);

_ __ _ __ _ __ _ __ _ 的__ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

更新: 2011年5月9日

所以我还没有找到解决方案,我开始怀疑这些程序是否已经过时了?文档肯定是。举个例子:说明说

 swig -octave swig_test.i -o swig_test_wrap.cxx

现在无论如何都肯定无法工作,因为mkoctfile不会像前面所说的那样采用cxx类型。此外,此命令只是在物理上写错了。如上所述,它返回错误。

 swig error : unrecognized option example.i
 use swig -help for available options

命令应该输入为:

 swig -octave -o swig_test_wrap.cpp swig_test.i

这将生成swig_test_wrap.cpp文件,就像宣传的一样。我原本以为在swig的argv中会有一个输入文件的-i选项,但是,嘿,现在我知道这里的顺序很重要,当他们改变一些关于函数如何工作的东西时,有些人必须没有更新文档。

现在,在运行此命令后,我有了swig_test_wrap.cpp文件。接下来我尝试执行

mkoctfile swig_test_wrap.cpp swig_test.c

同样,我得到了与上面相同的错误:“无效的协变返回类型”等,但是我也得到了一个文件swig_test.o。为了好玩,我接着跑了

mkoctfile swig_test.o

瞧,这个DOES会生成一个名为swig_test.oct的文件。但是当我进入八度音并尝试通过运行

加载文件时
octave:1>swig_test

我在第1行第1列附近得到响应错误:'swig_test'未定义

据我所知,我正好回到原点。有人有主意吗?

2 个答案:

答案 0 :(得分:1)

事实证明,这个问题与我使用的八度音阶有关。 Octave版本3.4.0似乎不适用于swig。我得到了source-forge的帮助,一旦我降级到版本3.2.4-r3,它就完美无缺。

这是一个必须使用的已知错误:

swig -octave -o WRAPFILE.cpp INPUT.i

并且mkoctfile的问题是你必须使用.cpp扩展名,因为它们应该接受.cxx扩展名,因为它是C ++文件的有效扩展名。

答案 1 :(得分:0)

尝试:

$ swig -octave -c++ swig_test.i -o swig_test_wrap.cxx
$ mkoctfile swig_test_wrap.cxx swig_test.c

here所述。