Сбой 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 для передачи аргумента в качестве значения. Ни одна из них не работает, что приводит к той же ошибке, что и выше Я читал о "склеивающих функциях", но мне не удалось найти руководство по их созданию (несмотря на то, что в каждом источнике указывалось, что "большинству программистов это просто")>.>
В любом случае, у меня есть следующие варианты, и если вы поможете мне с любым из них, я буду вечно благодарен:
- Получите эту функцию CALL_EXTERNAL для работы
- Сделайте так, чтобы код на C как-то захватывал нужные данные из памяти
- Переписать все в C++ (вам не нужно помогать с этим)
Заранее спасибо.
1 ответ
Я думаю, что вы пытаетесь смешать 32-битный и 64-битный код. Похоже, вы компилируете свой код как 64-битный, но вы используете 32-битный IDL. Чтобы проверить это, IDL распечатывает его при запуске или вы можете проверить вручную:
IDL> print, !version.memory_bits
64