4

AIX 5.1 マシンで Perl から C++ ライブラリーを呼び出そうとしています。これを実行するために、非常に単純なテスト プロジェクトを作成しました。

私の C++ 共有ライブラリ ( test.cpp):

#include <stdio.h>
#include <iostream>

void myfunc()
{
    printf("in myfunc()\n");
    std::cout << "in myfunc() also" << std::endl;
}

私の SWIG インターフェイス ファイル ( test.i):

%module test
%{
void myfunc();
%}
void myfunc();

次に、共有オブジェクトを次のように構築します。

swig -c++ -perl test.i
g++ -c test_wrap.cxx -I/usr/opt/perl5/lib/5.6.0/aix/CORE -o test_wrap.o
g++ -c test.cpp -o test.o
ld -G -bI:/usr/opt/perl5/lib/5.6.0/aix/CORE/perl.exp -bnoentry -bexpall -lc_r test.o test_wrap.o -o test.so

この時点で、test.soPerl で (生成された SWIG を介してtest.pm) ロード可能な共有オブジェクトができました。共有オブジェクトをロードして、エクスポートしている 1 つの関数を呼び出そうとする非常に単純な perl スクリプトがあります ( test.pl)。

#!/usr/bin/perl
use test;
test::myfunc();

を実行するtest.plと、次の出力が得られます。

myfunc() の
不正な命令 (コアダンプ)

std::coutの使い方をコメントアウトすればmyfunc問題なく動作します。C++ STL で何かを使用するとコア ダンプが発生するように見えます (単に astd::vectorとを宣言しようとしましたstd::stringstreamが、どちらもコア ダンプになります)。STL を使用するスタンドアロンの C++ 実行可能ファイルを問題なく作成できます。問題が発生するのは、perl からロードされたときに共有オブジェクトで呼び出されたときだけです。

gcc ではなく xlc を使用してみましたが、同じ結果が得られます。すべてのリンケージが正しく行われるようにするために渡す必要があるファンキーなリンカ フラグがあると思いますか? どんなアイデアでも大歓迎です...

編集:リンカを直接呼び出す代わりにgcc/を使用してリンクすると ( )、すぐにセグメンテーション違反が発生します。perl が単に共有ライブラリをロードしようとするとクラッシュするようです。上記のように呼び出すことは、動作に最も近いものですが、いくつかのライブラリまたは C++ ライブラリ用の特別な AIX リンカー フラグが不足している可能性があると思います。xlcldld

Edit2:わかりました、私はそれを機能させました。AIX は、リンクに関しては非常に脆弱です。最終的に、正しく機能しているように見える次のリンク コマンドを思いつきました。

ld -G -bI:/usr/opt/perl5/lib/5.6.0/aix/CORE/perl.exp -bnoentry -bexpall -lC -lc -ldl test.o test_wrap.o -o test.so

私がリンクしたライブラリは最も関連性があります。ライブラリが言及される順序も非常に重要であることがわかりました(うーん)。また、これは AIX 5.1 に同梱されている Perl 5.6.0 に対してビルドされていることにも注意してください。Perl 5.8.8 に対して同じ単純なアプリケーションを構築しようとしましたが、うまくいきません。ただし、(直接呼び出す代わりにストレートgcc/を使用する) はるかに健全なリンク方法の方が適切に機能するように思われます。したがって、この問題は Perl ディストリビューションまたはリンカなどのバグのようです。xlcld

願わくば、これが AIX で作業しなければならないことで呪われた哀れな魂の助けになることを願っています...

4

2 に答える 2

4

libstdc++ を ld コマンドに追加するだけではありませんか? 例: -lstdc++?

問題を再現した後、Linuxで行ったことは次のとおりです。

gcc -g -lstdc++ -shared test*.o -o test.so

その後、問題は解決しました。

(ld のライブラリの正確なリストを取得しようとするのは大変な作業だったので、gcc にそれを行うように指示しました。)

于 2008-10-08T22:10:19.950 に答える
0

私は SWIG について何も知りませんが、(pascal、fastcall、またはその他の呼び出し規則ではなく) cdecl を使用した関数を期待していることも確認したい場合があります。ツール間で間違ったものを使用すると、「悪いことが起こる」ことにつながる可能性があります (私が知る限り、通常はスタックの破損です)。

于 2008-10-08T23:53:53.390 に答える