Makefile 小记

CXXFLAGS

编译 Memtis/silo benchmark 时,一个宏定义一直找不到

1
2
3
macros.h:32:2: error: #error "no CONFIG_H set"
32 | #error "no CONFIG_H set"
| ^~~~~

检查 Makefile,CONFIG_H 有定义且路径正确,并且已经通过 CXXFLAGS += -DCONFIG_H=\"$(CONFIG_H)\" 传递给编译器,十分奇怪。

打印调试输出。

1
2
$(info CXXFLAGS are $(CXXFLAGS))
# CXXFLAGS are -Wno-error=deprecated-declarations

这下明白了,我执行的 make 命令为 make CXXFLAGS+="-Wno-error=deprecated-declarations",Makefile 中定义的 CXXFLAGS 被覆盖。把命令行参数去掉后再打印 CXXFLAGS,与 Makefile 中定义一致。

此时还要处理另一个问题

1
cc1plus: all warnings being treated as errors

无法从命令行传递 -Wno-error=deprecated-declarations,则直接在 Makefile 中:

1
CXXFLAGS += -Wno-deprecated-declarations

再编译,终于成功。

Appendix

  • include: 如果文件不存在会导致 make 报错。
  • -include: 如果文件不存在,make 会忽略这个文件并继续执行。
  • -j: 启用并行构建

Werror

有时编译器会报如下两种类型的 warnings ( treated as error )

  • [Werror=err_name]
  • [Werr_name]

CXXFLAGS 中分别构造 FLAG,关闭即可[1]

1
2
3
CXXFLAGS += -Wno-error=stringop-overflow -Wno-stringop-overflow
CXXFLAGS += -Wno-error=array-bounds -Wno-array-bounds
CXXFLAGS += -Wno-error=restrict -Wno-restrict

  1. gcc 13.2 compile error ↩︎