【问题标题】:IDL CALL_EXTERNAL crashing when passing arguments to C++将参数传递给 C++ 时,IDL CALL_EXTERNAL 崩溃
【发布时间】:2013-07-06 11:39:46
【问题描述】:

我正在尝试使用 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++ 重写所有内容(您无需为此提供帮助)

提前致谢。

【问题讨论】:

    标签: c++ shared-libraries idl-programming-language


    【解决方案1】:

    我认为您正在尝试混合使用 32 位和 64 位代码。看起来您正在将代码编译为 64 位,但您正在运行 32 位 IDL。要检查这一点,IDL 会在启动时打印出来,或者您可以手动检查:

    IDL> print, !version.memory_bits
          64
    

    【讨论】:

    • 我会在星期一检查这个。只是想让你知道我没有忘记这件事。
    • 好的,所以我的开发环境正在以 64 位编译,而命令行 idl 正在以 32 位编译。我从命令行收到了该错误消息,因为 DE 没有给出任何有用的错误。 (它只是崩溃)。无论如何,我用 -64 标记启动 IDL 以将其置于 64 位模式,现在它可以编译了。但是,现在看来,如果我尝试传递 args,我会从 C++ 共享库中得到分段错误。我想这不再与这个问题真正相关了,但是我如何将 args 传递给共享库而不导致分段错误?
    • 使用CALL_EXTERNAL 将参数传递给特定例程相当简单。检查CALL_EXTERNAL 的文档(特别是VALUE 关键字)和外部开发指南(IDL 分发的help/pdf 目录中的erg.pdf)。
    • 是的,我想我已经在 IDL 端正确编码了它,现在我在 C++ 端遇到了问题。我什至不能在带有参数的终端中调用它。
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多