如何在Rcpp包的src/Makevars中覆盖g++默认编译选项
R包编译强制使用-O0的解决方案
要在包的src/Makevars中实现完全替换默认的-O2优化级别为-O0,你需要通过过滤并替换编译标志来实现,而非简单追加参数。具体方案如下:
推荐方案:动态替换优化级别
在src/Makevars中添加以下内容,可适配所有常见C标准(C98/11/14等),自动移除原有优化选项并替换为-O0:
# 移除所有以-O开头的优化参数,添加-O0 CXXFLAGS := $(filter-out -O%,$(CXXFLAGS)) -O0 CXX11FLAGS := $(filter-out -O%,$(CXX11FLAGS)) -O0 CXX14FLAGS := $(filter-out -O%,$(CXX14FLAGS)) -O0
filter-out -O%,$(VAR)会剔除变量中所有-O开头的选项(如-O2、-O3),再追加-O0,确保最终只使用你需要的优化级别。
备选方案:重写指定C++标准的编译标志
如果你明确使用某一C标准(比如C14),可以直接重写对应变量,同时保留R默认的必要编译参数(如-fPIC):
# 针对C++14标准设置编译标志 CXX14FLAGS = -std=c++14 -fPIC -O0
注意必须保留-fPIC这类R编译共享库的必要参数,否则会出现编译错误。
之前尝试方法的问题说明
- 第一种方法把命令行执行语句写到了
Makevars里,这是错误用法,Makevars仅用于定义编译变量,不是完整的编译命令。 PKG_CXXFLAGS = -O0只是追加参数,最终编译命令会同时包含-O2 -O0,虽然部分编译器会取最后一个选项,但这种方式不规范,且可能在不同编译环境下出现不一致行为。
内容的提问来源于stack exchange,提问作者Waldir Leoncio
相关产品推荐
相关产品推荐

