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

问题描述 投票:0回答:1

我看了很多与这个问题相关的帖子,并尝试了所有的解决方案。在我的情况下,没有一个办法可以解决,包括将makevars从 Rcpp. 总之,当我在Travis上进行构建时,我得到了以下的错误信息。

undefined symbol: dpotrf_’

有趣的是,这个软件包在windows、macOS和linux上都能正常安装。

这里是我的回帖 R包

travis-ci rcpp rcpparmadillo
1个回答
1
投票

免责声明:我和D_Williams一起工作,但我发现了这个问题,其他人可能会觉得有用。

一个有效的 configure.ac 是存在的,并且存在一个Makevars.in。问题是 configure 文件尚未生成。这是一个autotoolsautoconf设置。为了解决这个问题,我运行了 autoconf 在包目录下,生成了 configure 文件。那 configure 文件会在R构建软件包时执行。该 configure 文件修改了 Makevars.in 并创建 Makevars. 那 Makevars 文件最终定义了在哪里可以找到库、包括、编译器、编译器选项等。

如果你做了 引起 configure 文件从 configure.ac 使用 autoconf那就没有 configure 要执行的文件,而没有 Makevars 来在编译时定义所需的选项,因此,编译器没有完全配置好,会失败。因此,编译器没有完全配置好,它将失败。

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


2
投票

我可以在一个非常标准的Debian测试系统上重现这个故障 (我用这个系统来进行 广泛 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到C的映射。也许你在与RcppArmadillo的接口上出了问题。很难说...)

编辑。 你提交了编译后的代码和一个Windows库。"不要这样做。" 当Travis构建的时候,它也是从一个 git 和我一样结账。 这可能是区别。

编辑2: 不是这样的 但你的R代码混合了 .Call() 与生成的入口点(即通过RcppExports.cpp和RcppExports.R)。我曾见过有人这样做。 这可能是值得研究的问题。

© www.soinside.com 2019 - 2024. All rights reserved.