Сбой IDL CALL_EXTERNAL при передаче аргументов в C++

Я пытаюсь запустить скрипт C++ из IDL с помощью функции CALL_EXTERNAL. Я смог заставить его работать без аргументов, но когда я пытаюсь добавить аргумент, такой как один 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++ (вам не нужно помогать с этим)

Заранее спасибо.

1 ответ

Решение

Я думаю, что вы пытаетесь смешать 32-битный и 64-битный код. Похоже, вы компилируете свой код как 64-битный, но вы используете 32-битный IDL. Чтобы проверить это, IDL распечатывает его при запуске или вы можете проверить вручную:

IDL> print, !version.memory_bits
      64
Другие вопросы по тегам