【问题标题】:Object files in R-package too large (Rcpp)R 包中的目标文件太大 (Rcpp)
【发布时间】:2017-09-18 13:32:27
【问题描述】:

我正在使用 Rcpp 将 C++ 代码集成到 R 包中。编译后,我看到 *.o 文件很大(~2Mb),而原始 *.cpp 和 *.h 文件只有 ~20kb。这种差异从何而来?我之前在没有 Rcpp 和 *.o 文件的情况下实现了类似的功能,但文件几乎没有那么大。有了这个文件大小,我的包超过了 check() 允许的 4Mb。

【问题讨论】:

  • 查看 Dirk 关于剥离调试信息的帖子:dirk.eddelbuettel.com/blog/2017/08/20/…
  • 因为它本质上是 C++。帮自己一个忙,并在您的.libPaths() 中的另一个共享库上快速执行ls -l

标签: c++ r rcpp r-package


【解决方案1】:

正如this question 的回答中所述,C++ 编译对象可能这么大有几个原因。在 Rcpp 案例中, Dirk Eddelbuettel writes in this post 的可能原因是共享库。

我的建议是遵循@coatless 评论并在包的package/src 中创建一个Makevars 文件(您可以从rcopulib 包中复制这些文件)以指定共享库的编译器选项(那些.h 可能被叫了好几次)。

或者您可以为您的 Makevars 复制以下代码:

strippedLib: $(SHLIB)
        if test -e "/usr/bin/strip" & test -e "/bin/uname" & [[ `uname` == "Linux" ]] ; then /usr/bin/strip --strip-debug $(SHLIB); fi
.phony: strippedLib

因为 Dirk 的回答对 OSX as mentioned in this discussion 有问题。

补充说明:

注意 Makevars 中的表格和空格(它们意味着某些东西)。具体来说,第二行是 2 个制表符(不是空格)。

【讨论】:

    【解决方案2】:

    回复Rodrigo's answer here,因为我没有足够的声誉来发表评论。

    我将它包含在我的agtboost R 包的makevars 中,但 CRAN 维护人员抱怨说。我收到以下电子邮件:

    The CRAN policy contains
    
    - Packages should not attempt to disable compiler diagnostics, nor to
    remove other diagnostic information such as symbols in shared objects.
    

    警告如果不采取行动,包裹将从 CRAN 中移除。

    因此,最好记下该注释,并向 CRAN 维护人员解释原因是由于大型 C++ 编译对象。请注意,从 R>=3.6.0 开始,以下是可能的,但用户必须在安装期间主动做出此选择

    R CMD install --strip
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多