首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SWIG创建Octave文件

使用SWIG创建Octave文件
EN

Stack Overflow用户
提问于 2011-05-04 17:35:20
回答 2查看 912关注 0票数 0

我正在尝试使用SWIG创建一个Octave函数。但是,即使是最基本的示例代码似乎在我有机会进入八度之前就失败了。我不确定是否应该担心swig为C++源文件(.cxx)创建了一个扩展名类型,它生成了mkoctfile不识别的文件(它只需要.C .cpp .cc,这看起来像分配给swig那样混乱,创建了它不支持的C++的扩展名)。

任何有更多经验的人在这方面的帮助将是非常感谢的!

我所采取的步骤如下:

代码语言:javascript
复制
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个错误,结果一致:

代码语言:javascript
复制
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的源代码

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
%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日

所以我还没有找到解决这个问题的办法,我开始怀疑这些程序是不是过时了?最肯定的是文档。举个例子:说明书上写着

代码语言:javascript
复制
 swig -octave swig_test.i -o swig_test_wrap.cxx

现在,不管怎么说,这肯定不会起作用,因为mkoctfile不会像前面提到的那样采用cxx类型。而且,这个命令只是物理上写错了。如上面所键入的,它返回错误。

代码语言:javascript
复制
 swig error : unrecognized option example.i
 use swig -help for available options

应将该命令输入如下:

代码语言:javascript
复制
 swig -octave -o swig_test_wrap.cpp swig_test.i

这将生成swig_test_wrap.cpp文件,就像广告中提到的那样。我本以为在swig的argv中会有一个输入文件的-i选项,但是嘿,既然我知道这里的顺序很重要,那么一定有人在更改函数的工作方式时没有更新文档。

所以现在,在运行这个命令之后,我有了我的swig_test_wrap.cpp文件。接下来我拿着它试着执行

代码语言:javascript
复制
mkoctfile swig_test_wrap.cpp swig_test.c

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

代码语言:javascript
复制
mkoctfile swig_test.o

瞧,这确实生成了一个名为swig_test.oct的文件。但是,当我进入octave并试图通过运行

代码语言:javascript
复制
octave:1>swig_test

我得到响应错误:在第1列附近未定义的“swig_test”

据我所知,我马上就回到原点。有人有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-13 16:20:32

所以事实证明,这个问题与我使用的八度音阶有关。Octave版本3.4.0似乎还不适用于swig。我在源代码伪造方面得到了帮助,一旦我降级到3.2.4-r3版本,它就完美地工作了。

这是一个已知的bug,您必须使用:

代码语言:javascript
复制
swig -octave -o WRAPFILE.cpp INPUT.i

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-04 19:57:01

尝试:

代码语言:javascript
复制
$ swig -octave -c++ swig_test.i -o swig_test_wrap.cxx
$ mkoctfile swig_test_wrap.cxx swig_test.c

正如所描述的这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5887494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档