2013-07-03 67 views
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作爲值傳遞。兩者都不會導致與上述相同的錯誤。我已經閱讀了關於「膠水功能」的內容,但是我一直無法找到製作它們的指南(儘管每個源代碼都表明它對大多數程序員來說都很簡單「>」。>

無論如何,我的選項如下,如果你能幫助我任何,我會永遠感激:

  1. 得到這個CALL_EXTERNAL功能工作
  2. 有C代碼搶它從內存某種程度上
  3. 重寫一切都需要在數據C++(你不需要這個幫助)

在此先感謝。

回答

0

我認爲你正在嘗試混合使用32位和64位代碼。它看起來像你正在編譯你的代碼爲64位,但你運行的是32位IDL。要對此進行檢查,IDL打印它,當它啓動,或者您可以手動檢查:

IDL> print, !version.memory_bits 
     64 
+0

我會檢查這個星期一。只是想讓你知道我沒有忘記這件事。 – Kammeot

+0

好吧,所以我的開發人員環境正在編譯64位,而命令行idl正在編譯32位。我從命令行得到了這個錯誤消息,因爲DE沒有提供任何有用的錯誤。 (它只是崩潰)。無論如何,我開始使用-64標記的IDL將其置於64位模式,現在編譯。但是,現在看來,如果我嘗試傳遞參數,我會從C++共享庫中得到分段錯誤。我想這不是真的與這個問題有關,但我怎麼會將args傳遞給共享庫而不會導致分段錯誤? – Kammeot

+0

用'CALL_EXTERNAL'將參數傳遞給一個特定的例程相當簡單。查看關於'CALL_EXTERNAL'(尤其是'VALUE'關鍵字)和外部開發指南(* erg.pdf *在IDL發行版的* help/pdf *目錄中)的文檔。 – mgalloy