SWIG は AIX で簡単にコンパイルおよびインストールできます。残念ながら、単純なSWIG hello world (これもコンパイルされますが、それほど簡単ではありません) は、Segmentation Fault または Illegal Instruction (コンパイル/リンカー プロセスの詳細によって異なります) でクラッシュします。これは、gcc と xlc (IBM c コンパイラー) の両方で発生します。同音異義語の GNU ld がシステムにインストールされていなかったため、ネイティブ AIX リンカー 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 とオープン ソース コミュニティは、「共有ライブラリ」が何を意味するかについて、まったく異なる考えを持っていると思います。AIX ネイティブ リンカーから取得する最も一般的な共有オブジェクト (つまり) には、シンボルがまったく含まれていません (実際、サイズは 1kB 未満です)。また、リンカから壊れた出力を取得することも非常に簡単です (そのような場合、リンク中に次のような未解決のシンボルの非常に長いリストが表示されます)。
ld: 0711-317 ERROR: Undefined symbol: PyType_Type
やるべきことをやっていると-berok
、解決策がさまざまなリンカーオプションをハッキングしていることは明らかです. 実際、空でない .so ライブラリを作成するいくつかの組み合わせを、エラーを生成せずに見つけることができます。これらの組み合わせの 1 つが上記の Makefile スニペットで報告されています (他にもあります)。残念ながら、それらはすべて次の 2 つのモードのいずれかで失敗します。-bnoentry
-bexpall
-brtl
-bshared
-bM:SRE
-bexpfull
$ python -c "import example"
Illegal instruction (core dumped)
また
$ python -c "import example"
Segmentation fault (core dumped)
gcc を使用するか、別のバージョンの python (私たちは 7 を持っています!) を使用しても、32 ビットでも 64 ビットでも何も変わりません。「適切な」リンク オプションを見つけることはできますが、実行時にクラッシュします。これを解決するには?