gpt4 book ai didi

gcc - gnu arm 汇编器命令行宏失败并显示 "Invalid identifier for .ifdef"

转载 作者:行者123 更新时间:2023-12-02 19:48:53 27 4
gpt4 key购买 nike

我的工具链是最新版本的arm-gcc。

我的汇编文件中有一段代码,必须有条件地包含/汇编。

.ifdef MACRO_FROM_CMDLINE
Assembly instr1
Assembly instr2
.endif

封装代码是最近添加的。

我都尝试过:

gcc -x assembler-with-cpp --defsym MACRO_FROM_CMDLINE=1 <along with other necessary options> 

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 <along with other necessary options>

-D 会导致“.ifdef 的标识符无效”和“.endif without .if”错误。

--defsym 会导致“MACRO_FROM_CMDLINE=1:没有这样的文件或目录”、“无法识别的选项 --defsym”错误。

最佳答案

gcc 二进制文件通过按顺序调用许多其他程序来实际执行各个工作阶段(编译、汇编、链接)来驱动编译过程。

当你说:

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...

您要求它通过 C 预处理器运行源代码,然后通过汇编器运行结果。

C 预处理器步骤将变为:

.ifdef MACRO_FROM_CMDLINE

进入:

.ifdef 1

在将其传递给汇编器之前,汇编器无法理解它。这就是您收到“无效标识符”错误的原因。它还解释了为什么使用 C 预处理器 #ifdef 可以解决该问题。

<小时/>

--defsym 不起作用,因为它是汇编程序的一个选项,而不是 gcc 驱动程序的一个选项。 (gcc 驱动程序确实理解并将一些选项传递给它调用的一些程序,但不是全部。)

但是,您可以使用

将任意选项传递给汇编器
-Wa,option[,option...]

语法,告诉 gcc 驱动程序将这些选项传递给汇编器(作为空格分隔的选项列表)。

例如:

gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...

添加

--defsym MACRO_FROM_CMDLINE=1

gcc 调用它时传递给 as 的选项列表,这就是使原始 .ifdef 示例工作的方法。

<小时/>

您可以通过添加 -v 选项来查看由 gcc 调用的各个程序,以及它实际传递给它们的选项。

在这种情况下,您应该看到使用 -E 标志(仅预处理)调用名为 cc1(实际的 GCC C 编译器二进制文件)的内容来预处理输入一个临时文件,然后在临时文件上调用 as 来组装它。

关于gcc - gnu arm 汇编器命令行宏失败并显示 "Invalid identifier for .ifdef",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12768306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com