为什么 gcc 编译器标志未知?

Why is gcc compiler flag unknown?

一直在尝试添加此标志:-Wshadow=compatible-local (documentation) 在编译时,它只是不断抛出此消息:


`error: unknown warning option '-Wshadow=compatible-local';
 did you mean '-Wshadow- uncaptured-local'?
 [-Werror,-Wunknown-warning-option]`

我的 makefile 片段:

# COMPILER & FLAGS ============================================================

CC = gcc
CFLAGS = -g -std=c11 -O3 \
         -Wall -Wextra -Werror \
         -Wshadow -Wshadow=compatible-local \
         -Wno-sign-compare \
         -fsanitize=integer \
         -fsanitize=undefined \
         -fsanitize=address -fsanitize-address-use-after-scope

更新:

注意:我的编译器版本是clang-900.0.39.2。 (它说 clang 即使你输入 gcc,因为我使用的是 macOS 并且很好......@Aconcagua 在下面解释了原因)


有人知道为什么会这样吗? and/or 如何解决?

似乎 clang 使用了完全不同的标志命名:http://clang.llvm.org/docs/DiagnosticsReference.html#wshadow-uncaptured-local

应该是-Wshadow-uncaptured-local而不是-Wshadow=compatible-local

前段时间,GCC 是 MacOS 上的默认编译器,然后 Apple 决定改用 clang 作为默认编译器。假设他们将 GCC 链接到 clang 以避免人们想知道为什么编译器消失了(嗯,更合理:不破坏任何构建系统......)。好主意?至少在不兼容性发挥作用时会导致混乱...

"How to fix?"

在您的系统上安装真正的 GCC,将符号链接替换为 clang。

如果您更喜欢继续使用 clang(这也是一个不错的选择),请删除显然是 GCC 特定且不受 clang 支持的标志(您可以将其替换为 clang 的等效项,请参阅 vpetrigo's ) .

您甚至可以调整您的 makefile 以与两者兼容:Get the compiler's version string, check if the string returned contains "gcc" 或 "clang" 然后有条件地添加适当的编译器标志。