SWIG se compile et s'installe facilement sous AIX. Malheureusement, un simple SWIG hello world (qui compile aussi - mais pas si facilement) se bloque avec une erreur de segmentation ou une instruction illégale (en fonction de certains détails du processus de compilation/éditeur de liens). Cela se produit avec gcc et xlc (compilateur IBM c). J'ai essayé seulement l'éditeur de liens AIX natif, car les homonymes GNU ld n'étaient pas installés sur mon système.SWIG se bloque sur AIX (avec python, et probablement tout le support SWIG)
fichier: example.c
#include <time.h>
double My_variable = 3.0;
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);
}
char *get_time()
{
time_t ltime;
time(<ime);
return ctime(<ime);
}
fichier: example.i
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
Makefile extrait:
swig -python example.i
xlc -q64 -c example.c example_wrap.c -I/your-python-path/include/python2.5/
ld -G -b64 -berok -bnoentry -bexpall -brtl example.o example_wrap.o -o _example.so
L'étape de liaison est une problématique. Si vous suivez les exemples sur le tutorial, vous devriez faire
ld -bshared example.o example_wrap.o -o _example.so #the b is not a typo, but a different syntax in AIX vd GNU ld
Malheureusement, cela ne fonctionne pas pour plusieurs raisons. Je crois qu'IBM/AIX et les communautés Open Source ont des idées tout à fait différentes sur ce que signifie «bibliothèque partagée». Les objets partagés les plus communs (donc) que vous obtenez de l'éditeur de liens natifs AIX ne contiennent aucun symbole (et ont en fait une taille inférieure à 1 Ko). Il est également assez facile à obtenir une sortie brisée de l'éditeur de liens (dans ce cas, une liste assez longue des symboles non résolus comme celle-ci apparaît en liant):
ld: 0711-317 ERROR: Undefined symbol: PyType_Type
Faire ce que l'on est supposed to do, il semble clair que la solution est le piratage avec les diverses options de l'éditeur de liens, , -bnoentry
, -bexpall
, -brtl
, -bshared
, -bM:SRE
, -bexpfull
. En fait, il est possible de trouver des combinaisons qui créent une bibliothèque .so non vide, sans générer d'erreurs. Une de ces combinaisons est signalée dans l'extrait Makefile ci-dessus (il y en a d'autres). Malheureusement, tous échouent dans l'un des deux modes suivants!
$ python -c "import example"
Illegal instruction (core dumped)
ou
$ python -c "import example"
Segmentation fault (core dumped)
Utilisation du gcc, ou une autre version de python (nous avons 7!) Soit 32 bits ou 64 bits ne change rien: vous pouvez trouver un lien "bon" option, mais il se bloque à l'exécution. Comment résoudre ceci?