2009-11-14 8 views
2

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(&ltime); 
    return ctime(&ltime); 
} 

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?

Répondre

0

Ce n'est pas une question réelle, mais un rapport sur la façon dont j'ai résolu mon problème (voir here pourquoi je fais cela). Et en fait, je n'ai pas pu le résoudre moi-même, mais c'était grâce à this other guy. Je le réécris ici, parce qu'il était trop spécifique (AIX 5.1 avec perl et C++, et je l'ai trouvé par hasard, alors que je cherchais quelque chose d'autre! Je n'ai pas pu trouver sa réponse quand je cherchais ça J'ai un problème avec AIX 5.3 avec python et C. Je crois que c'est commun à toutes les installations SWIG sous AIX (donc je n'ai pas tagué python et C). Contactez les développeurs bientôt afin qu'ils puissent résoudre l'aide en premier lieu.

Eh bien, la solution est tout simplement d'utiliser une ligne de liaison différente, en particulier comme suit:

ld -G -bI:/your-python-path/lib/python2.5/config/python.exp -bnoentry -bexpall -lC -lc -ldl example.o example_wrap.o -o _example.so 

La clé est le fichier exp, que vous devez vous trouver pour votre langue/installation:

find /your-python-or-perl-or-other-language-path/ -name *exp 

Espérons que cela aide!