2

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

ファイル: 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 ビットでも何も変わりません。「適切な」リンク オプションを見つけることはできますが、実行時にクラッシュします。これを解決するには?

4

2 に答える 2

1

この投稿は私を直接助けませんでしたが、再び正しい方向を示しました-しかし、状況は異なります.私は組み込みのpythonを構築しています. http://docs.python.org/extending/embedding.html#linking-requirementsを参照してください

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_config_var("LINKFORSHARED")
'-Wl,-bE:Modules/python.exp -lld'
于 2010-08-26T15:43:22.917 に答える
0

これは実際の質問ではありませんが、私がどのように問題を解決したかについてのレポートです (なぜ私がこれを行っているかを参照してください)。で、実は自分では解決できなかったのですが、この方のお陰でした。彼はあまりにも具体的だったので、ここに書き直します (Perl と C++ を使用した AIX 5.1 で、何か他のものを探しているときに偶然彼を見つけました! これを探していたときに、彼の答えをまったく見つけることができませんでした)。問題! この投稿が他の人にもっと見つけられることを願っています! 私の問題は Python と C を使用する AIX 5.3 にあります. AIX 上のすべての SWIG インストールに共通していると思います (したがって、Python と C にタグを付けませんでした). I'最初にヘルプを修正できるように、すぐに開発者に連絡します。

まあ、修正は、特に次のように、別のリンク行を使用するだけです:

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

キーは exp ファイルです。これは、言語/インストール用に自分で見つける必要があります。

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

お役に立てれば!

于 2009-11-14T19:26:25.250 に答える