RcppEigen 和包大小

RcppEigen and package size

我正在维护一个使用 RcppEigen 的包。包本身有少量代码(目前 +- 1000 行)。

我不明白的是我的库的文件大小非常大,导致我的 <packagename>.so 的文件大小为 14MB,<packagename>.o 的文件大小为 11MB。

我想该包将 link 动态地添加到 RcppEigen 库(从而使我的包的二进制文件的大小保持相对较小)。但我的猜测是 link 将库静态地放入我的 .o 和 .so 文件中。

(附带说明,当我提交给 CRAN 时,注意到大包裹尺寸,但这并不是拒绝的原因。)

这是预期的行为。我没有检查过,但我希望大多数使用 RcppEigen(或 RcppArmadillo)的包都能得到这个注释。那是因为 Eigen(和 Armadillo)是一个 header-only 库 ,即它 不是 动态链接。相反,相应的函数被编译到每个 *.o 文件中。这可能比静态链接更糟糕:如果一个函数在多个编译单元中使用,它将最终出现在多个 *.o 文件中,导致 *.so 中同一函数的多个版本。这是我们为方便 header-only 图书馆而必须付出的代价。获得正确的动态(或静态)链接可能真的很困难,尤其是在 Windows.

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