我正在尝试使用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'未定义
据我所知,我正好回到原点。有人有主意吗?
答案 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所述。