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