如何从CFLAGS/CXXFLAGS中过滤指定编译选项解决编译错误?
解决编译选项过滤无效的替代方案
问题背景
当前构建过程中,全局传递的编译选项如下:
CFLAGS="-Os -pipe -fno-caller-saves -fno-plt -mfloat-abi=soft -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -I/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/usr/include -I/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/include " CXXFLAGS="-Os -pipe -fno-caller-saves -fno-plt -mfloat-abi=soft -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -I/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/usr/include -I/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/include " LDFLAGS="-L/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/arm-buildroot-linux-gnueabi/sysroot/usr/lib -L/opt/toolchains/crosstools-arm_softfp-gcc-10.3-linux-4.19-glibc-2.32-binutils-2.36.1/arm-buildroot-linux-gnueabi/sysroot/lib -znow -zrelro "
其中-Wformat、-Werror=format-security、-fstack-protector、-D_FORTIFY_SOURCE=1这几个选项引发编译错误,之前尝试的filter-out方法因变量操作错误无效。
可行解决方法
方法1:直接针对CFLAGS/CXXFLAGS变量过滤
问题选项实际存在于CFLAGS和CXXFLAGS中,直接对这两个变量使用filter-out即可:
# 剔除CFLAGS中的错误选项 CFLAGS := $(filter-out -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1, $(CFLAGS)) # 剔除CXXFLAGS中的错误选项 CXXFLAGS := $(filter-out -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1, $(CXXFLAGS))
方法2:通过命令行调用时覆盖变量
如果编译选项是通过环境变量传递的,可以在调用make时直接修改变量值:
make CFLAGS="$(printf '%s\n' "$CFLAGS" | xargs -n1 | grep -vE '^-Wformat$|^-Werror=format-security$|^-fstack-protector$|^-D_FORTIFY_SOURCE=1$' | xargs)" \ CXXFLAGS="$(printf '%s\n' "$CXXFLAGS" | xargs -n1 | grep -vE '^-Wformat$|^-Werror=format-security$|^-fstack-protector$|^-D_FORTIFY_SOURCE=1$' | xargs)"
该命令会将CFLAGS和CXXFLAGS拆分为单独选项,过滤掉指定的错误选项后重新拼接。
方法3:使用override关键字确保修改生效
如果原CFLAGS/CXXFLAGS是通过override定义或从命令行传递的,需要用override关键字保证你的修改不会被覆盖:
override CFLAGS := $(filter-out -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1, $(CFLAGS)) override CXXFLAGS := $(filter-out -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1, $(CXXFLAGS))
原方法无效原因
之前的代码混用了MAKE_FLAGS和MAKE_VARS变量,但实际包含问题选项的是CFLAGS和CXXFLAGS,针对错误变量操作自然无法生效。
内容的提问来源于stack exchange,提问作者navaneeth reddy l
相关产品推荐
相关产品推荐

