2016-05-18 22 views
0

これは一部の人にとっては簡単な質問ですが、私はどこの解決策も見つけられません。 私はRStudioの初心者です.RStudio内からオープンソースのfortran77シミュレーションプログラム(cとC++コードもあります)の特定のルーチンを呼び出したいと思います。 FortranプログラムはコンパイルにMakefileを使用しており、多くの.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サブルーチンの2番目の共有オブジェクトファイルを作成しようとしましたが、dyn.loadでロードしても問題は解決しませんでした。私はおそらくここで何か間違っているが、私は何がわからない。すべてのオブジェクトファイルを.so共有オブジェクトファイルに変換し、dyn.loadを使用してそれぞれのファイルをロードする必要がありますか(約100個の.oファイルがあります)、または「ラッパー/通信」ファイルアプローチが機能しますか? FortranプログラムとRStudioの間の通信を確立する方法はありますか?簡単な解決策は、プログラムや交流の両方から読み/テキストファイルを書くことだったでしょう

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) 
} 

:私だけの情報(第二dyn.loadは違いはありませんのでご注意)のためにここに私のRStudioのスクリプトを貼り付けていますそのファイルを介してデータを取得することができますが、ほとんどの時間ステップでファイルを開いたり閉じたりする必要があるため、これによりシミュレーションが実際に遅くなると私は理解しています。 ありがとうございます。

+0

まだ応答がないので、私は上記のことを試して単純化する必要があります。 1. \t RStudio(dyn.loadと.Fortran)を使用してFortranルーチンを呼び出します。 2. \t Fortranルーチンが単純な内部計算を行うとき、私はRSTudioに有効な答えを返します 3. \t Fortranルーチンが別のファイルの別のサブルーチンを呼び出すと、すべてが失敗し、RStudioはそのサブルーチンの名前は未定義のシンボルです。また、サブルーチンの名前の後にアンダースコア "_"を付けます。同じファイル内で別のサブルーチンを呼び出すと正常に動作しているようです。 – Spartan

答えて

0

これは私が思ったよりもずっと簡単でした。共有された.soファイルの初心者間違いでした。共有ファイルを作成し、2つ(またはそれ以上)のオブジェクトファイルにリンクする際に問題が解決されました。たとえば、2.Fとそれぞれの1.oと2.oを呼び出す1.Fがある場合は、共有ファイルを作成するときに両方のファイルを含める必要があります。 gfortran -shared -o 1plus2.so 1.o 2。 o

関連する問題