1

我正在尝试使用 CALL_EXTERNAL 函数从 IDL 运行 c++ 脚本。我已经能够让它在没有参数的情况下工作,但是当我尝试添加一个 arg 时,例如单个 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 关键字以将 arg 作为值传递。两者都不起作用,导致与上述相同的错误。我读过“胶水函数”,但我一直找不到制作它们的指南(尽管每个来源都表明它“对大多数程序员来说很容易””>。>

无论如何,我的选择如下,如果你能帮助我,我将永远感激:

  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 回答