1
我試圖使用CALL_EXTERNAL函數從IDL運行C++腳本。我已經能夠讓它在沒有參數的情況下工作,但是當我嘗試添加一個參數時,比如單個IDL LONG INT,IDL崩潰。與錯誤:將參數傳遞給C++時發生IDL CALL_EXTERNAL崩潰
% 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作爲值傳遞。兩者都不會導致與上述相同的錯誤。我已經閱讀了關於「膠水功能」的內容,但是我一直無法找到製作它們的指南(儘管每個源代碼都表明它對大多數程序員來說都很簡單「>」。>
無論如何,我的選項如下,如果你能幫助我任何,我會永遠感激:
- 得到這個CALL_EXTERNAL功能工作
- 有C代碼搶它從內存某種程度上
- 重寫一切都需要在數據C++(你不需要這個幫助)
在此先感謝。
我會檢查這個星期一。只是想讓你知道我沒有忘記這件事。 – Kammeot
好吧,所以我的開發人員環境正在編譯64位,而命令行idl正在編譯32位。我從命令行得到了這個錯誤消息,因爲DE沒有提供任何有用的錯誤。 (它只是崩潰)。無論如何,我開始使用-64標記的IDL將其置於64位模式,現在編譯。但是,現在看來,如果我嘗試傳遞參數,我會從C++共享庫中得到分段錯誤。我想這不是真的與這個問題有關,但我怎麼會將args傳遞給共享庫而不會導致分段錯誤? – Kammeot
用'CALL_EXTERNAL'將參數傳遞給一個特定的例程相當簡單。查看關於'CALL_EXTERNAL'(尤其是'VALUE'關鍵字)和外部開發指南(* erg.pdf *在IDL發行版的* help/pdf *目錄中)的文檔。 – mgalloy