2016-05-18 62 views
0

我很抱歉,如果這是一些人的簡單問題,但我無法在任何地方找到解決方案。 我是一名RStudio初學者,我想從RStudio內部調用一個開源Fortran77仿真程序(裏面還有c和C++代碼)的特定例程。 Fortran程序使用Makefiles進行編譯,並生成許多.o目標文件(順便說一句,我使用的是Unix)。我在Fortran中編寫了一個封裝文件,它與模擬程序一起編譯,它應該被RStudio用於調用Fortran例程。我生成該包裝文件的共享對象文件.so,如果我在該包裝文件中進行了簡單的計算,那麼這一切都可以正常工作。我下面同樣的過程在這個優秀的帖子: http://www.r-bloggers.com/fortran-and-r-speed-things-up/rstudio調用fortran子程序 - 未定義符號錯誤

我用dyn.load和.Fortran成功,我得到的結果回來,只要我不叫,它們位於在另一個文件中的子程序(以及對應其他目標文件和其他.so文件)。當我嘗試從包裝子程序中調用另一個子程序我得到以下錯誤:

Error in dyn.load("rwrapper.so") : 
    unable to load shared object '/home/adminuser/ESP-rSource/src/esrubps/rwrapper.so': 
    /home/adminuser/ESP-rSource/src/esrubps/rwrapper.so: undefined symbol: runit_ 

runit(無下劃線)是位於另一個文件的另一個目的文件中的另一個子程序。然後我嘗試爲該runit子例程創建第二個共享對象文件,並且還使用dyn.load加載它,但沒有解決問題。我可能在這裏做錯了什麼,但我不知道是什麼。我是否需要將所有目標文件轉換爲.so共享目標文件,然後使用dyn.load加載它們中的每一個(大約有100個.o文件),還是「包裝/通信」文件方法工作?有沒有辦法在Fortran程序和RStudio之間建立通信?只有我在這裏貼上我RStudio腳本信息(注意,第二dyn.load不會有所作爲):

myrwrapper <- function(rrrandom) { 
    if (!is.loaded('rwrapper')) { 
    dyn.load("rwrapper.so") 
    } 
    if (!is.loaded('esru_lib')) { 
    dyn.load("./home/adminuser/ESP-rSource/src/lib/esru_lib.so") 
    } 
    retvals <- .Fortran("RXCHNGE",icomp = as.integer(2), rCOUPLEVAR = as.numeric(rrrandom)) 
    return(retvals$rCOUPLEVAR) 
} 

一個簡單的解決辦法是寫/讀這兩個程序和交換文本文件通過該文件的數據,但我的理解是,這將使模擬真的很慢,因爲幾乎在每個時間步驟都需要打開/關閉文件,所以我試圖避免這種方法。 謝謝你的幫助。

+0

由於還沒有迴應,我應該嘗試簡化上面所說的。 1. \t我使用RStudio(dyn.load和.Fortran)來調用一個fortran程序。 2. \t當fortran例程具有簡單的內部計算時,我在RStudio中接收到一個有效答案 3. \t當fortran例程調用另一個文件中的另一個子例程時,整件事失敗,RStudio發出消息說該子程序的名稱是未定義的符號。它也在子程序的名字後面加下劃線「_」。在同一個文件中調用另一個子例程似乎工作正常。 – Spartan

回答

0

這實際上比我想象的要容易得多。這是共享的.so文件的新手錯誤。問題在創建共享文件並將其鏈接到兩個(或更多)目標文件而不是一個時解決。例如,如果您有1.F(其調用2.F以及相應的1.o和2.o),則在創建共享文件時應包括這兩個文件: gfortran -shared -o 1plus2.so 1.o 2。 o