压缩 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.
我的问题如下:
- post 是 2017 年 8 月的。有人知道它是否通过了 CRAN 检查吗?
- 这是一个 GNU/Linux(可能是 macOS)解决方案。有跨平台选项吗?
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 的最新新闻文件。
我的包 .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.
我的问题如下:
- post 是 2017 年 8 月的。有人知道它是否通过了 CRAN 检查吗?
- 这是一个 GNU/Linux(可能是 macOS)解决方案。有跨平台选项吗?
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 的最新新闻文件。