结合 R、C++ 和 Fortran

Combine R, C++ and Fortran

我正在尝试使用 C++ 和 RCpp 重新实现 R 函数以加快计算速度。在 C++ 实现中,我需要使用在 link.

中找到的 Fortran 函数 mvtdst
#include <Rcpp.h>
#include "mvtnorm.h" 
using namespace Rcpp;

// [[Rcpp::export]] 
NumericVector pmvnorm_rcpp(NumericVector upper, NumericMatrix corr) 
{
   double error;
   double mvnP = pmvnorm_P(2, upper, corr, &error) ;
   return mvnP ;  
}

/*** R
pmvnorm_rcpp(c(1.5,1.5),c(0.0))
*/

这里,pmvnorm_P定义在mvtnorm.cpp文件中。

link 中找到的所有文件都与 RcppWrapper.cpp 文件一起保存在工作目录中。

当我使用 RCpp 包中的 sourceCpp() 函数编译 RcppWrapper.cpp 文件时,出现以下错误。

mvtnorm.o:mvtnorm.cpp:(.text+0x7c): undefined reference to `mvtdst_' collect2.exe: error: ld returned 1 exit status Error in Rcpp::sourceCpp("RcppWrapper.cpp") : Error occurred building shared library.

有谁知道如何解决这个错误?

Fortran 和 C++ 对函数名称的处理方式不同。看起来 mvtdst 是您的 Fotran 函数的名称。 (对吗?)当从 C++ 调用时,您需要手动 "mangle"。因此,不要调用 mvtdst,而是调用带有结尾下划线的 mvtdst_

不幸的是,编译器在 mangling 中不一致,因此这将不可移植。 (为了使其可移植,您需要某种预处理来匹配编译器的处理。)

当您在 两个 个源文件中有代码时

  • mvtnorm.cpp 调用您的后端函数 pmvnorm_P()
  • 另一个提供它的文件

那么您还必须提供link说明。简而言之,sourceCpp() 仅适用于单文件解决方案(除非您提供 link 说明)。

最简单的修复:只需创建一个包 将您的所有 文件组装到src/