1

CALL_EXTERNAL 関数を使用して IDL から C++ スクリプトを実行しようとしています。引数なしで動作させることができましたが、単一の IDL LONG INT などの引数を追加しようとすると、IDL がクラッシュします。エラーで:

% CALL_EXTERNAL: Error loading sharable executable.
                 Symbol: main, File = /home/inspired/workspace/TestCode/main.
                 so
                 /home/inspired/workspace/TestCode/main.so: wrong ELF class:
                 ELFCLASS64
% Execution halted at: TEST_EXTERNAL       7
  /home/inspired/IDLWorkspace/Analyze Data/test_external.pro
%                      $MAIN$    

私が使用しているテストコードは次のとおりです。

C++ コード:

#include <iostream>

int main(int argc, char *argv[]) {
    int temp = (int) strtod(argv[1], NULL);
    std:cout<<temp;
    return temp;
}

IDL コード:

pro test_external
 c= call_external('/home/inspired/workspace/TestCode/main.so','main', long(2), /AUTO_GLUE)
 print,c
end

もちろん、このコードは練習用のコードですが、これを機能させることができなければ、配列と値の混合物を渡すことはできません。

特に明記しない限り、IDL は参照によってすべてを渡します。そのため、渡された引数を C++ コードのポインターとして扱い、 /ALL_VALUE キーワードを設定して引数を値として渡すようにしました。どちらも機能せず、上記と同じエラーが発生します。「グルー関数」について読んだことがありますが、それらを作成するためのガイドを見つけることができませんでした (すべてのソースが「ほとんどのプログラマーにとって簡単」であることを示しているにもかかわらず)" >.>

とにかく、私のオプションは次のとおりです。何かお手伝いできることがあれば、永遠に感謝します。

  1. この CALL_EXTERNAL 関数を機能させる
  2. C コードで必要なデータを何らかの方法でメモリから取得する
  3. すべてを C++ で書き直します (これを手伝う必要はありません)。

前もって感謝します。

4

1 に答える 1

0

32 ビットと 64 ビットのコードを混在させようとしていると思います。コードを 64 ビットとしてコンパイルしているように見えますが、32 ビット IDL を実行しています。これを確認するには、IDL の起動時に出力するか、手動で確認します。

IDL> print, !version.memory_bits
      64
于 2013-07-06T03:39:46.083 に答える