用R包压缩共享库

时间:2019-12-19 19:57:02

标签: r rcpp r-package

我的软件包.so文件大于3 MB(最大10 MB),具体取决于编译器和系统。多年来,这在我的包装中生成了一个带有R CMD check的NOTE。我的软件包中没有包含太多代码,因此我最终进行搜索以减小大小,并发现了Dirk Eddelbuettel的excellent post

按照建议,我在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

但是有人提到:

  

该方案甚至可以通过CRAN,但我尚未尝试过。

我的问题如下:

  • 帖子发布于2017年8月。有人知道它是否通过了CRAN检查?
  • 这是GNU / Linux(也许是macOS)解决方案。有跨平台的选择吗?

1 个答案:

答案 0 :(得分:4)

您不能将其放在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:~$ 

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

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的最新NEWS文件。