压缩 R 包中的共享库

JRR*_*JRR 6 r rcpp r-package

我的包.so文件大于 3 MB(最多 10 MB),具体取决于编译器和系统。这会R CMD check在我的包中生成一个注释多年。我的包不包含这么多代码,所以我最终搜索以减小大小,我发现了 Dirk Eddelbuettel 的这篇优秀文章

按照我SHLIB_CXX11LDFLAGS = -Wl,-S -shared在我的.R/Makevars库中添加的建议,我的库大小从 10.4 MB 下降到 580 KB!我第一次有 0 个错误、0 个警告和 0 个注释。是的!

然而,这只是局部解决方案。在帖子的最后,建议以下内容src/Makevars

strippedLib: $(SHLIB)
        if test -e "/usr/bin/strip"; then /usr/bin/strip --strip-debug $(SHLIB); fi

.phony: strippedLib
Run Code Online (Sandbox Code Playgroud)

但有人提到:

而且这个方案甚至可能通过 CRAN 审核,但我还没有尝试过。

我的问题如下:

  • 该帖子来自 2017 年 8 月。有人知道它是否通过 CRAN 检查吗?
  • 这是一个 GNU/Linux(可能是 macOS)解决方案。有跨平台选项吗?

Dir*_*tel 5

AFAIK 你不能把它放进去src/Makevars。我只需要自己在一个包中恢复它,其中的力量被注意到了

但是,令人困惑的是,我们也有

edd@rob:~$ grep -i strip /etc/R/Makeconf     # convenience softlink on Debian/Ubuntu
STRIP_STATIC_LIB = strip --strip-debug
STRIP_SHARED_LIB = strip --strip-unneeded
edd@rob:~$ 
Run Code Online (Sandbox Code Playgroud)

但我还没有时间搜索这些是否/在哪里使用。所以我还是

edd@rob:~$ grep -i strip ~/.R/Makevars 
STRIP=-Wl,-S
SHLIB_CXXLDFLAGS = $(STRIP) -shared
SHLIB_CXX11LDFLAGS = $(STRIP) -shared
SHLIB_CXX14LDFLAGS = $(STRIP) -shared
SHLIB_FCLDFLAGS = $(STRIP) -shared
SHLIB_LDFLAGS = $(STRIP) -shared
edd@rob:~$ 
Run Code Online (Sandbox Code Playgroud)

这是仅限本地的。

编辑:我一直忘记的是最近--strip为安装程序添加的选项:

edd@rob:~$ R CMD INSTALL --help | grep strip
      --strip           strip shared object(s)
edd@rob:~$ 
Run Code Online (Sandbox Code Playgroud)

这也可以通过将环境变量_R_SHLIB_STRIP_设置为真值来启用——请参阅最近的 R 新闻文件。