【问题标题】:What does -A option do in gcc?gcc 中的 -A 选项有什么作用?
【发布时间】:2019-07-24 12:01:50
【问题描述】:

gcc 中的-A 选项有什么作用?我正在使用arm-none-linux-gnueabi-gcc

以下是我的 makefile 中的规则。

$(SH_OBJ): $(OBJS)

$(CC) $(LFLAGS) -o $@-debug -A $@-debug $^ $(LIBPATH) $(LDLIBS)

【问题讨论】:

  • 您是否在文档中查找了您正在使用的 gcc 版本? gcc.gnu.org/onlinedocs
  • 原来它是针对预处理器的一个过时的旧功能,不过在它的参数中应该有一个=...
  • 从 make 规则来看,这个答案/谓词似乎没有意义。我想知道它是否正在生成汇编程序?也许$(CC) 不是 gcc,但有些看起来很像。该规则的示例命令行会很有帮助。例如,为什么-o-A 相同?

标签: linux gcc makefile compilation arm


【解决方案1】:

我建议查一下,因为这是我以前从未见过的选项,所以我听从了自己的建议。 -A 是传递给预处理器的选项:

来自documentation

-A 谓词=answer

用谓词谓词做一个断言并回答答案。这种形式优于旧形式 -A predicate(answer),它仍然受支持,因为它不使用 shell 特殊字符。请参阅过时的功能。

-A -predicate=answer

使用谓词谓词取消断言并回答答案。

(不过,您的 makefile 中的参数是 $@-debug,它缺少用于拆分谓词和答案部分的 =。奇怪。)

还有documentation on assertions:

在编写条件语句以测试编译后的程序将在哪种计算机或系统上运行时,断言是宏的一种已弃用的替代方法。断言通常是预定义的,但您可以使用预处理指令或命令行选项来定义它们。

断言旨在提供一种更系统的方式来描述编译器的目标系统,我们添加它们是为了与现有编译器兼容。实际上,它们与系统特定的预定义宏一样不可预测。此外,它们不是任何标准的一部分,只有少数编译器支持它们。因此,使用断言的可移植性不如使用系统特定的预定义宏。我们建议您完全不要使用它们。

我猜这是一个非常古老的项目的生成文件?

【讨论】:

  • 看来= 部分可以省略:我在man gcc 中看到了-Aquestion=answer -A-question[=answer]。我想,这意味着预处理器应该测试谓词是否已定义?没有把握。是否有意义?无论如何,必须使用预处理器才能找出答案。此处的文档可能更清晰(它的开头有 question,后面有 predicate=answer 部分仅在前者中标记为可选)。毫不奇怪,因为该功能今天可能很少使用。
  • @VladislavIvanishin 第二种形式是unassert 的问题。注意“问题”前的减号“-”。我查看了代码,它基本上是创建一个命令行'#define',但我认为你不能在上面使用'#undef'。例如你不能#undef __arm__。它就像根据dump gcc cpp defines 的内置定义。
  • 我尝试将它与我的 Ubuntu 7.4.0-1ubuntu1~18.04.1 x86_64 一起使用,但它似乎没有做任何事情。该代码使用在 gcc 源代码的 libcpp 中找到的cpp_assert()。如果我按照 OP 所说的进行操作,则会引发错误。即,-Afoo-debug 给出了 error: missing '(' after predicate... 显示了某种注释。这就是为什么我认为它不是 gcc optoin,而可能是链接器或汇编器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2013-07-15
相关资源
最近更新 更多