Использование SWIG для создания файла Octave - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь использовать 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

Это приводит к четырем ошибкам:

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);

_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

ОБНОВЛЕНИЕ: 9 мая 2011

Так что я до сих пор не нашел решения этой проблемы, и я начинаю задумываться, не устарели ли эти программы?Документация наверняка есть.Просто в качестве примера: в инструкциях написано

 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, как объявлено.Я бы подумал, что в argv из swig будет опция -i для входного файла, но, эй, теперь, когда я знаю, что порядок здесь важен, кто-то, должно быть, просто не обновил документацию, когда они что-то изменили о том, как работает функция.

Итак, после выполнения этой команды у меня есть файл swig_test_wrap.cpp.Затем я беру это и пытаюсь выполнить

mkoctfile swig_test_wrap.cpp swig_test.c

. Снова я получаю ту же ошибку, что и выше: «недопустимый ковариантный тип возврата» и т. Д., Однако, я также ДОЛЖЕН получить файл swig_test.o из процесса.Просто для забавы я тогда запустил

mkoctfile swig_test.o

И вот, этот файл генерирует файл с именем swig_test.oct.Однако, когда я вошел в октаву и попытался загрузить файл, запустив

octave:1>swig_test

, я получил ответ error: 'swig_test' undefined возле строки 1 столбца 1

Так что, насколько я могу судить, я вернулся к исходной точке.У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Получается, что эта проблема связана с версией октавы, которую я использовал. Octave версии 3.4.0 пока не работает с swig. Я получил помощь по source-forge и, как только я опустился до версии 3.2.4-r3, он работает отлично.

И это известная ошибка, которую вы должны использовать:

swig -octave -o WRAPFILE.cpp INPUT.i

и проблема с mkoctfile в том, что вы должны использовать расширение .cpp, так как они ДОЛЖНЫ принимать расширение .cxx, так как это допустимое расширение для файлов C ++.

0 голосов
/ 04 мая 2011

Попробуйте:

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

как описано здесь .

...