结合 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/
。
我正在尝试使用 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/
。