2011-05-04 2 views
0

J'essaie d'utiliser SWIG pour créer une fonction Octave. Mais même le code d'exemple le plus élémentaire semble échouer avant que j'aie même la chance de l'obtenir en octave. Je ne suis pas sûr si je devrais être concerné que swig crée un type d'extension pour le fichier source C++ (.cxx) qu'il génère que mkoctfile ne reconnaît pas (il prend seulement .C .cpp .cc, qui semble être allouer pour swig pour gâcher ça et créer ce qui ressemble à l'extension ONE pour C++, il ne supporte pas).Utilisation de SWIG pour créer un fichier Octave

Toute aide d'une personne ayant plus d'expérience dans ce domaine serait grandement appréciée!

Les étapes que je l'ai fait sont les suivantes:

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 

Il en résulte 4 erreurs Consistantly:

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' 

Le code source de mon saugrenus de base 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); 
} 

Puis le code de mon wrapper fichier inteface 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); 

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

MISE À JOUR: 9 mai 2011

Je n'ai pas encore trouvé une solution à cela, et je commence à me demander si peut-être ces programmes sont périmés? La documentation est très certainement. À titre d'exemple: les instructions indiquent

swig -octave swig_test.i -o swig_test_wrap.cxx 

maintenant cela ne fonctionnera certainement pas peu importe, parce que mkoctfile ne prendra pas le type cxx comme indiqué précédemment. De plus, cette commande est mal écrite. Comme indiqué ci-dessus, il renvoie l'erreur.

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

La commande DEVRAIENT être entré comme:

swig -octave -o swig_test_wrap.cpp swig_test.i 

qui va générer le fichier swig_test_wrap.cpp comme annoncé.J'aurais pensé qu'il y aurait une option -i pour le fichier d'entrée dans argv de swig, mais bon, maintenant que je sais que l'ordre est important ici, quelqu'un doit juste ne pas avoir mis à jour la documentation quand il a changé quelque chose sur la fonction. Maintenant, après avoir lancé cette commande, j'ai mon fichier swig_test_wrap.cpp. Ensuite, je prends cela et essayer d'exécuter

mkoctfile swig_test_wrap.cpp swig_test.c 

Encore une fois, je reçois la même erreur que ci-dessus: « type de retour covariant invalide » etc, mais je fais aussi obtenir un swig_test.o de fichiers du processus. Juste pour le plaisir, je puis couru

mkoctfile swig_test.o 

Et voici et voici, cela génère un fichier appelé swig_test.oct. Cependant, quand je suis entré dans l'octave et ai essayé de charger le fichier en exécutant

octave:1>swig_test 

Je reçois la réponse erreur: « swig_test » non défini près de la ligne 1 colonne 1

Pour autant que je peux dire, Je suis de retour à la case départ. Quelqu'un a des idées?

Répondre

1

Il s'avère donc que ce problème est lié à la version d'octave que j'utilisais. Octave version 3.4.0 ne semble pas encore fonctionner avec swig. J'ai obtenu de l'aide sur la source-forge et une fois que j'ai rétrogradé à la version 3.2.4-r3 cela fonctionne parfaitement.

Et il est un bug connu que vous devez utiliser:

swig -octave -o WRAPFILE.cpp INPUT.i 

et son problème avec mkoctfile que vous devez utiliser l'extension .cpp, car ils acceptent l'extension de .cxx comme il est une extension valide pour les fichiers C++.

0

Essayez:

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

comme décrit here.

+0

Eh bien, quand j'essaie de faire la première ligne, j'obtiens la réponse "swig error: option non reconnue swig_test.i, utilisez 'swig -help' pour les options disponibles." Il fonctionne alors (un peu) si je me débarrasse de -o swig_test_wrap.cxx, et qu'il génère le fichier swig_test_wrap.cxx. Mais alors si j'essaye d'exécuter la deuxième ligne (en laissant l'extension .cxx sur le dossier) j'obtiens la réponse: "mkoctfile: argument non reconnu test_file_wrap.cxx". Est-ce que je fais quelque chose de mal ici? Avoir la mauvaise version de swig ou mkoctfile je ne peux pas croire qu'il ne prendra pas l'option -o, et insiste sur la génération d'un fichier incoimpatable de type .cxx – dynamphorous

+0

Désolé, je ne peux pas aider plus loin pour l'instant. – Wok

+0

Merci pour votre effort, il est apprécié! – dynamphorous

Questions connexes