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 的反向依赖性检查中使用该系统来重现失败。
安装包 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-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
文件最终定义了在哪里可以找到库、包含、编译器、编译器选项等。
如果您不是使用autoconf
从configure.ac
生成configure
文件,那么就没有configure
文件要执行,并且没有 Makevars
在编译时定义所需的选项。所以编译器没有完全配置好,会失败
TLDR:如果你有一个 configure.ac
,你 必须 运行 autoconf
,并将该配置文件提交到你的 repo . R 需要执行它才能使 Makevars 正常工作。
我查看了许多与此问题相关的其他帖子并尝试了每个解决方案。 None 在我的案例中有效,包括从 Rcpp
复制 makevars。无论如何,在 Travis 上构建时出现以下错误
undefined symbol: dpotrf_’
有趣的是,该软件包在 windows、macOS 和 linux 上安装良好。
这是我的仓库 R package
我可以在非常标准的 Debian 测试系统(我将其用于 extensive 对 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-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
文件最终定义了在哪里可以找到库、包含、编译器、编译器选项等。
如果您不是使用autoconf
从configure.ac
生成configure
文件,那么就没有configure
文件要执行,并且没有 Makevars
在编译时定义所需的选项。所以编译器没有完全配置好,会失败
TLDR:如果你有一个 configure.ac
,你 必须 运行 autoconf
,并将该配置文件提交到你的 repo . R 需要执行它才能使 Makevars 正常工作。