這對我來說最初看起來是一個簡單的任務,但我無法得到以下工作。我試圖將fortran子例程包裝到Rcpp調用中,以便使用R中的可用函數。我們的目標是將函數合併到一個包中,所以只在特定的* .so文件中使用dyn.load()是不可行的(除非有人能告訴我怎麼做?)。從閱讀類似的帖子,我懷疑在makevars文件中指定標誌可能會解決問題,但提供的信息是非常簡單的here和一些澄清將真誠讚賞。在Rcpp中包裝fortran函數
我已經完成了以下文件,因爲我可以遵循。
- 與
Rcpp.package.skeleton
- 將在創建的RCPP包裝一個基本的cpp文件(HELLO.CPP)
- 創建的src目錄
- 創建包結構我Fortran文件(hello.f) R檔來創建一個「乾淨」的函數調用(即避免
.Call
用戶和前.Call
允許運行的其他內部計算)
然而,當我嘗試建立我的包(帶RStudio),我碰到下面的錯誤輸出:
==> R CMD INSTALL --no-multiarch --with-keep.source fortran
g++ -shared -o fortran.so RcppExports.o hello.o hello.o rcpp_hello_world.o -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
* installing to library ‘/home/.../R/x86_64-pc-linux-gnu-library/3.0’
* installing *source* package ‘fortran’ ...
** libs
hello.o: In function `hello_wrapper':
/home/.../r_code/fortran/src/hello.cpp:16: multiple definition of `hello_wrapper'
hello.o:/home/.../r_code/fortran/src/hello.cpp:16: first defined here
collect2: error: ld returned 1 exit status
make: *** [fortran.so] Error 1
ERROR: compilation failed for package ‘fortran’
* removing ‘/home/.../R/x86_64-pc-linux-gnu-library/3.0/fortran’
Exited with status 1.
我的文件如下:
hello.f
subroutine hello()
print *, "hello world"
end subroutine hello
打招呼。 h
extern "C"
{
void hello();
}
HELLO.CPP
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include "hello.h"
#ifdef __cplusplus
extern "C"
{
SEXP hello_wrapper();
}
#endif
SEXP
hello_wrapper()
{
hello();
}
wrapper.R
hello_r <- function(){
.Call("hello_wrapper");
}
是的,我也想提出這個建議。除此之外,它應該是微不足道的。 – 2014-10-27 19:44:21
將'hello.f'重命名爲'hello_fortran.f'並將'hello.cpp'重命名爲'hello_cpp.cpp',但是'dyn.load ...中的另一個錯誤...無法加載共享對象/ home/.../fortran.so:undefined symbol:hello' – cdeterman 2014-10-27 19:58:31
@DirkEddelbuettel,我已經瞭解到fortran函數在頭文件中需要一個下劃線,並在cpp文件中調用。完成此操作後,該包會成功建立。我會接受這個答案,因爲它解決了我最初的問題,但同樣感謝你Dirk,我很欣賞你的幫助。 – cdeterman 2014-10-27 20:17:52