【问题标题】:Why is gcc compiler flag unknown?为什么 gcc 编译器标志未知?
【发布时间】:2019-02-19 21:07:03
【问题描述】:

编译时尝试添加此标志:-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。 (即使您输入gcc,它也会显示clang,因为我使用的是macOS,而且……@Aconcagua 在下面解释了原因)


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

【问题讨论】:

  • 我相信这是两个不同的标志,在documentation 中有不同的段落。所以是的,一个用于-Wshadow,另一个用于-Wshadow=compatible-local...如果我做错了,请纠正我。
  • 什么 gcc 版本?也许您的版本太旧,无法支持该标志。
  • 那不是 gcc。那是叮当声。
  • 可能是兼容性链接/别名
  • 前段时间,GCC 是 MacOS 上的默认编译器,后来 Apple 决定改用 clang 作为默认编译器。假设他们将 GCC 链接到 clang 以避免人们想知道为什么编译器消失了(嗯,更合理:不要破坏任何构建系统......)。好主意?至少在不兼容的情况下会导致混乱......

标签: c++ c gcc compiler-errors compiler-flags


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    “如何解决?”

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

    如果您更喜欢使用 clang(这也是一个不错的选择),请删除显然是 GCC 特定且不受 clang 支持的标志(您可以将其替换为 clang 的等价物,请参阅 vpetrigoanswer )。

    您甚至可以调整您的 makefile 以与两者兼容:Get 编译器的版本字符串,检查该字符串是否返回 contains“gcc”或“clang”,然后有条件地添加适当的编译器标志。

    【讨论】:

    • 最后一段不是是个好主意。它硬编码假设在几年甚至几个月内就会出错。相反,执行配置时(或等效)测试以确定编译器是否支持您想要的警告,并且仅在支持时启用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多