RcppEigen和包装尺寸

时间:2018-10-16 06:26:13

标签: rcpp

我正在维护一个使用document.addEventListener('printer_error', e => alert(e.details)); 的软件包。程序包本身有少量的代码(目前为+-1000行)。

我不明白我的库的文件大小很大,RcppEigen的文件大小为14MB,<packagename>.so的文件大小为11MB。

我可以想象该软件包将动态链接到<packagename>.o库(从而使我的软件包二进制文件的大小保持相对较小)。但是我的猜测却改为将库静态链接到我的.o和.so文件中。

  • 我是否会纠正这种情况?
  • 我可以避免吗?
  • 如果是这样,怎么办? 我在这里(RcppEigen.package.skeleton documentation看到NAMESPACE应该包含“ RcppEigen指令”;它也出现在我的NAMESPACE文件中)

(顺便说一句,当我向CRAN提交时,大的包装尺寸已注明,但并未引起拒绝。)

1 个答案:

答案 0 :(得分:4)

这是预期的行为。我尚未检查,但是我希望大多数使用RcppEigen(或RcppArmadillo)的软件包都可以得到此提示。这是因为Eigen(和Armadillo)是一个 header-only库,也就是说,它不是动态链接的 。而是将各个函数编译到每个*.o文件中。这可能比静态链接还要糟糕:如果一个函数在多个编译单元中使用,它将最终出现在多个*.o文件中,从而在*.so中导致同一函数的多个版本。这就是我们所有人都必须为仅标头库的便利付出的代价。确保动态(或静态)链接正确非常困难,尤其是在Windows上。

关于useDynLib:如果您查看软件包中的NAMESPACE文件,应该会看到类似useDynLib(<packagename> [...])的行。这告诉R加载与您的程序包关联的动态库,任何使用编译代码的R程序包都需要R。