我正在尝试使用SWIG创建一个Octave函数。但是,即使是最基本的示例代码似乎在我有机会进入八度之前就失败了。我不确定是否应该担心swig为C++源文件(.cxx)创建了一个扩展名类型,它生成了mkoctfile不识别的文件(它只需要.C .cpp .cc,这看起来像分配给swig那样混乱,创建了它不支持的C++的扩展名)。
任何有更多经验的人在这方面的帮助将是非常感谢的!
我所采取的步骤如下:
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瞧,这确实生成了一个名为swig_test.oct的文件。但是,当我进入octave并试图通过运行
octave:1>swig_test我得到响应错误:在第1列附近未定义的“swig_test”
据我所知,我马上就回到原点。有人有什么想法吗?
发布于 2011-05-13 16:20:32
所以事实证明,这个问题与我使用的八度音阶有关。Octave版本3.4.0似乎还不适用于swig。我在源代码伪造方面得到了帮助,一旦我降级到3.2.4-r3版本,它就完美地工作了。
这是一个已知的bug,您必须使用:
swig -octave -o WRAPFILE.cpp INPUT.imkoctfile的一个问题是必须使用.cpp扩展名,因为它们应该接受.cxx扩展名,因为它是C++文件的有效扩展名。
发布于 2011-05-04 19:57:01
尝试:
$ swig -octave -c++ swig_test.i -o swig_test_wrap.cxx
$ mkoctfile swig_test_wrap.cxx swig_test.c正如所描述的这里。
https://stackoverflow.com/questions/5887494
复制相似问题