SWIG легко компилируется и устанавливается в AIX. К сожалению, простой SWIG hello world (который также компилируется - но не так легко) падает с ошибкой сегментации или недопустимым указанием (в зависимости от некоторых деталей процесса компиляции / компоновщика). Это происходит как с gcc, так и с xlc (компилятор IBM c). Я пробовал только собственный компоновщик AIX ld, потому что омоним GNU ld не был установлен в моей системе.
Файл: 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);
}
Файл: 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:
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
Шаг компоновщика является проблематичным. Если вы будете следовать примерам учебник , вы должны сделать
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
К сожалению, это не работает по нескольким причинам. Я считаю, что у сообществ IBM / AIX и Open Source совершенно разные взгляды на то, что означает «разделяемая библиотека». Наиболее распространенные общие объекты (то есть), которые вы получаете от собственного компоновщика AIX, вообще не содержат символов (и на самом деле имеют размер менее 1 КБ). Также довольно просто получить неверный вывод из компоновщика (в таком случае при линковке появляется довольно длинный список неразрешенных символов, таких как следующие):
ld: 0711-317 ERROR: Undefined symbol: PyType_Type
Делая то, что каждый должен делать , кажется очевидным, что решение взломано с различными вариантами компоновщика, -berok
, -bnoentry
, -bexpall
, -brtl
, -bshared
-bM:SRE
, -bexpfull
. На самом деле, можно найти некоторые комбинации, которые создают непустую библиотеку .so, не генерируя ошибок. Об одной из этих комбинаций сообщается во фрагменте Makefile выше (есть и другие). К сожалению, все они выходят из строя в одном из следующих двух режимов!
$ python -c "import example"
Illegal instruction (core dumped)
или
$ python -c "import example"
Segmentation fault (core dumped)
Использование gcc или другой версии python (у нас 7!), 32-битной или 64-битной, ничего не меняет: вы можете найти «хорошую» опцию ссылки, но она вылетает во время выполнения. Как это решить?