【问题标题】:Compacting Shared Libraries in R package压缩 R 包中的共享库
【发布时间】:2019-12-19 19:57:02
【问题描述】:

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

但这只是本地解决方案。在帖子的末尾建议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】:

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

    【讨论】:

    • 至少我会用这个选项重新编译我所有的包。谢谢。
    • 为了绝对清楚,您的意思是,我们可以将_R_SHLIB_STRIP_ = 1 放入我们的src/Makevars 文件中?
    • 它是一个环境变量,所以你可以在.Renviron 和类似的地方使用它——一如既往地参见help(Startup)。我还把它放到了 install.r 和来自 littler 包的朋友中。 NEWS 文件中的更多详细信息:github.com/wch/r-source/blob/trunk/doc/NEWS.Rd#L1120-L1123(尽管链接中的行号会随着时间的推移变得陈旧/错误)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多