R包中的压缩共享库

问题描述 投票:3回答:1

我的软件包.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个注释。是的!

但是这只是一个local解决方案。在帖子末尾,建议对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)解决方案。有跨平台选项吗?
r rcpp r-package
1个回答
3
投票

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

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

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文件。

© www.soinside.com 2019 - 2024. All rights reserved.