RcppEigen 和包大小
RcppEigen and package size
我正在维护一个使用 RcppEigen
的包。包本身有少量代码(目前 +- 1000 行)。
我不明白的是我的库的文件大小非常大,导致我的 <packagename>.so
的文件大小为 14MB,<packagename>.o
的文件大小为 11MB。
我想该包将 link 动态地添加到 RcppEigen
库(从而使我的包的二进制文件的大小保持相对较小)。但我的猜测是 link 将库静态地放入我的 .o 和 .so 文件中。
- 我说的对吗?
- 我可以I/should避免这种情况吗?
- 如果可以,怎么做?
我在这里 (RcppEigen.package.skeleton documentation) 看到 NAMESPACE 应该包括 "a
useDynLib
directive";它也存在于我的 NAMESPACE 文件中)
(附带说明,当我提交给 CRAN 时,注意到大包裹尺寸,但这并不是拒绝的原因。)
这是预期的行为。我没有检查过,但我希望大多数使用 RcppEigen(或 RcppArmadillo)的包都能得到这个注释。那是因为 Eigen(和 Armadillo)是一个 header-only 库 ,即它 不是 动态链接。相反,相应的函数被编译到每个 *.o
文件中。这可能比静态链接更糟糕:如果一个函数在多个编译单元中使用,它将最终出现在多个 *.o
文件中,导致 *.so
中同一函数的多个版本。这是我们为方便 header-only 图书馆而必须付出的代价。获得正确的动态(或静态)链接可能真的很困难,尤其是在 Windows.
上
关于 useDynLib
:如果您查看包中的 NAMESPACE
文件,您应该会看到类似 useDynLib(<packagename> [...])
的行。这告诉 R 加载与您的包关联的动态库,并且对于使用编译代码的任何 R 包都是必需的。
我正在维护一个使用 RcppEigen
的包。包本身有少量代码(目前 +- 1000 行)。
我不明白的是我的库的文件大小非常大,导致我的 <packagename>.so
的文件大小为 14MB,<packagename>.o
的文件大小为 11MB。
我想该包将 link 动态地添加到 RcppEigen
库(从而使我的包的二进制文件的大小保持相对较小)。但我的猜测是 link 将库静态地放入我的 .o 和 .so 文件中。
- 我说的对吗?
- 我可以I/should避免这种情况吗?
- 如果可以,怎么做?
我在这里 (RcppEigen.package.skeleton documentation) 看到 NAMESPACE 应该包括 "a
useDynLib
directive";它也存在于我的 NAMESPACE 文件中)
(附带说明,当我提交给 CRAN 时,注意到大包裹尺寸,但这并不是拒绝的原因。)
这是预期的行为。我没有检查过,但我希望大多数使用 RcppEigen(或 RcppArmadillo)的包都能得到这个注释。那是因为 Eigen(和 Armadillo)是一个 header-only 库 ,即它 不是 动态链接。相反,相应的函数被编译到每个 *.o
文件中。这可能比静态链接更糟糕:如果一个函数在多个编译单元中使用,它将最终出现在多个 *.o
文件中,导致 *.so
中同一函数的多个版本。这是我们为方便 header-only 图书馆而必须付出的代价。获得正确的动态(或静态)链接可能真的很困难,尤其是在 Windows.
关于 useDynLib
:如果您查看包中的 NAMESPACE
文件,您应该会看到类似 useDynLib(<packagename> [...])
的行。这告诉 R 加载与您的包关联的动态库,并且对于使用编译代码的任何 R 包都是必需的。