RcppArmadillo 未定义符号:Travis 构建中的 dpotrf_

RcppArmadillo undefined symbol: dpotrf_ in Travis build

我查看了许多与此问题相关的其他帖子并尝试了每个解决方案。 None 在我的案例中有效,包括从 Rcpp 复制 makevars。无论如何,在 Travis 上构建时出现以下错误

undefined symbol: dpotrf_’

有趣的是,该软件包在 windows、macOS 和 linux 上安装良好。

这是我的仓库 R package

我可以在非常标准的 Debian 测试系统(我将其用于 extensive 对 Rcpp 和 RcppArmadillo 的反向依赖性检查中使用该系统来重现失败。

安装包 bainBFpack 之后(我有其余的)我试图从您刚刚签出的原始源构建 tar.gz。我得到:

*** installing help indices
*** copying figures
** building package indices
** testing if installed package can be loaded from temporary location
Error: package or namespace load failed for ‘BGGM’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/tmp/Rinst106c6ed5251a/00LOCK-BGGM/00new/BGGM/libs/BGGM.so':
  /tmp/Rinst106c6ed5251a/00LOCK-BGGM/00new/BGGM/libs/BGGM.so: undefined symbol: dpotrf_
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/tmp/Rinst106c6ed5251a/BGGM’
      -----------------------------------
ERROR: package installation failed

这似乎是一个中等复杂且足够大的程序包,所以请原谅我没有深入研究和调试。我建议您使用较小的模拟包进行简化,看看可能有什么问题。 (dpotrf 是一个相当标准的 LAPACK 例程,所以某个地方调用它。也许你明确地调用它。也许你做了一个 Fortran-to-C 映射错误。也许你在与 RcppArmadillo 的接口方面有问题。很难告诉...)

编辑: 您提交了编译代码和 Windows 库。 "Don't do that." 当 Travis 构建它时,它也像我一样从 git 结帐开始。这可能就是不同之处。

编辑 2: 不是,但是您的 R 代码将 .Call() 与生成的入口点混合(即通过 RcppExports.cpp 和 RcppExports.R).我已经看到其他人爆炸了。这可能值得研究。

免责声明:我与 D_Williams 一起工作,但我解决了问题,其他人可能会发现它有用。

存在一个正常工作的 configure.ac,并且存在一个 Makevars.in。 问题是 configure 文件尚未生成。这是一个 autotools/autoconf 设置。为了解决它,我在包目录中 运行 autoconf 生成了 configure 文件。然后在 R 构建包时执行 configure 文件。 configure 文件修改了 Makevars.in 并创建了 Makevars。该 Makevars 文件最终定义了在哪里可以找到库、包含、编译器、编译器选项等。

如果您不是使用autoconfconfigure.ac生成configure文件,那么就没有configure文件要执行,并且没有 Makevars 在编译时定义所需的选项。所以编译器没有完全配置好,会失败

TLDR:如果你有一个 configure.ac,你 必须 运行 autoconf,并将该配置文件提交到你的 repo . R 需要执行它才能使 Makevars 正常工作。