разделяемые библиотеки — сбой IDL CALL_EXTERNAL при передаче аргументов в переполнение стека

Я пытаюсь запустить скрипт 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]