压缩 R 包中的共享库

Compacting Shared Libraries in R package

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

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

但这只是一个本地解决方案。在 post 的末尾,建议 src/Makevars

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

.phony: strippedLib

但是提到:

And this scheme may even pass muster with CRAN, but I have not yet tried.

我的问题如下:

AFAIK 你不能把它放在 src/Makevars 中。我只需要自己在一个包中恢复它,其中的权力 noticed it

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

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:~$ 

不过我还没来得及搜索if/where这些都用过。所以我还是

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:~$ 

仅限本地。

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

edd@rob:~$ R CMD INSTALL --help | grep strip
      --strip           strip shared object(s)
edd@rob:~$ 

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