R CMD SHLIB编译F77代码时如何设置-fmax-stack-var-size适配CRAN发布
R包集成F77代码编译参数配置及CRAN兼容方案
1. 编译参数配置方法
你需要的-fmax-stack-var-size参数完全可以通过Makevars文件配置,这也是R包自定义编译选项的标准实现方式:
- 包源码根目录下新建
src文件夹(如果还没有的话),在src内创建名为Makevars的文件,写入以下内容:
# 针对gfortran编译器设置栈变量大小限制 ifeq ($(shell ${FC} --version 2>/dev/null | grep -i gfortran),) # 非gfortran编译器跳过该参数 FFLAGS += FCFLAGS += else # 数值根据你的实际数组大小调整,单位为KB FFLAGS += -fmax-stack-var-size=16384 FCFLAGS += -fmax-stack-var-size=16384 endif
其中FFLAGS对应F77代码的编译参数,FCFLAGS对应更高版本Fortran代码的编译参数,二者同时配置可覆盖所有Fortran代码场景。
如果是临时调试单独运行R CMD SHLIB,不需要修改Makevars的情况下,可以直接在命令行传入环境变量:FFLAGS="-fmax-stack-var-size=16384" R CMD SHLIB 你的F77源码文件.f
2. CRAN提交注意事项
- 必须增加编译器判断逻辑,不要直接全局加
-fmax-stack-var-size参数,该参数为gfortran专属,CRAN构建节点包含多种编译器,无判断的配置会触发非gfortran环境的编译错误,直接导致提交被拒。 - 建议优先从代码层面解决栈溢出风险:上世纪80年代的F77代码通常会将大数组声明为自动变量存储在栈空间,而系统默认栈空间通常仅为几MB到几十MB,即便调整编译参数也可能在其他低配置环境触发栈溢出。更稳妥的方案是将大数组改为动态分配、或是给数组增加
save属性存储到堆空间,从根本上规避栈大小限制,兼容性远优于修改编译参数。 - 你使用的该参数属于单编译单元的编译优化参数,没有修改全局运行环境,符合CRAN的政策要求,只要做好编译器兼容判断即可正常提交。
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

