我在unix平台(Ubuntu 14.04)上使用RcppArmadillo构建了一个R-package。运行R CMD CHECK时,我没有收到任何错误或警告,一切正常。但是,当我尝试通过win-builder构建Windows二进制文件时,我收到以下编译器错误消息:
/local330/lib -LD:/RCompile/recent/R/bin/i386 -lR
LD.o:LD.cpp:(.text+0x598): undefined reference to `ddot_'
LD.o:LD.cpp:(.text+0x8d3): undefined reference to `ddot_'
LD.o:LD.cpp:(.text+0x686b): undefined reference to `ddot_'
LD.o:LD.cpp:(.text+0x6af5): undefined reference to `ddot_'
在文件LD.cpp中,我使用Armadillo函数arma::dot
。文件的顶部看起来像
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;
当尝试在我的同事的Windows-PC上构建时,我得到相同的编译器错误消息。我怀疑链接到LAPACK / BLAS不能正常工作,但我不知道我能做些什么来解决这个问题。
我也使用#include<BH.h>
,但这是在不同的文件中。
修改的 我没有makevars或makevars.win文件。
以下是DESCRIPTION文件的相关部分:
Package: ...
Title: ...
Version: 0.0.0
Author: ...
Maintainer: ...
Description: ...
Depends:
R (>= 3.3.2)
License: GPL-3
LazyData: true
LinkingTo: Rcpp, RcppArmadillo, RcppProgress, BH
Imports:
Rcpp (>= 0.12.8),
RcppArmadillo (>= 0.7.500.0.0),
purrr (>= 0.2.2),
BH (>= 1.60.0-2),
stats,
utils
Suggests:
knitr,
testthat,
rmarkdown,
magrittr
VignetteBuilder: knitr
RoxygenNote: 5.0.1
SystemRequirements: C++11
这是最有可能导致问题的功能:
arma::mat test(const arma::mat& X) {
int n = X.n_rows;
int m = X.n_cols;
mat Xs(X.memptr(), n, m);
vec pv = arma::conv_to< vec >::from(mean(Xs));
for (int j = 0; j < m; j++) {
double p = pv(j);
double s = sqrt(p * (1 - p));
for (int i = 0; i < n; i++) {
Xs(i, j) = (Xs(i, j) - p) / s;
}
}
mat out(m, m);
for (int i = 0; i < m - 1; i++) {
for (int j = i + 1; j < m; j++) {
double tmp = pow(arma::dot(Xs.col(i), Xs.col(j)) / n, 2);
out(i, j) = tmp;
out(j, i) = tmp;
}
out(i, i) = pow(arma::dot(Xs.col(i), Xs.col(i)) / n, 2);
}
out(m - 1, m - 1) = pow(arma::dot(Xs.col(m - 1), Xs.col(m - 1)) / n, 2);
return out;
}