我看了很多与这个问题相关的帖子,并尝试了所有的解决方案。在我的情况下,没有一个办法可以解决,包括将makevars从 Rcpp
. 总之,当我在Travis上进行构建时,我得到了以下的错误信息。
undefined symbol: dpotrf_’
有趣的是,这个软件包在windows、macOS和linux上都能正常安装。
这里是我的回帖 R包
免责声明:我和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。
我可以在一个非常标准的Debian测试系统上重现这个故障 (我用这个系统来进行 广泛 Rcpp和RcppArmadillo的反向依赖性检查)。)
安装包后 bain
和 BFpack
(我有其余的)我试图从你的原始的刚检查出来的源头建立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)。我曾见过有人这样做。 这可能是值得研究的问题。