我的包.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 审核,但我还没有尝试过。
我的问题如下:
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 新闻文件。