我的工具链是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没有.if”错误。
--defsym
导致“MACRO_FROM_CMDLINE = 1:没有此类文件或目录”,“无法识别的选项--defsym”错误。
答案 0 :(得分:12)
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
到as
调用时传递给gcc
的选项列表,以及如何使原始.ifdef
示例正常工作。
通过添加gcc
选项,您可以看到-v
调用的各个程序及其实际传递给它们的选项。
在这种情况下,你应该看到一个名为cc1
(实际的GCC C编译器二进制文件)的东西,用-E
标志(仅预处理)调用来预处理输入到临时文件,然后{在临时文件上调用{1}}来组装它。
答案 1 :(得分:1)
奇怪,但事实证明我需要在汇编文件中使用C语法。
#ifdef MACRO
Assembly Instruction
Assembly Instruction
#endif
宏必须使用-D选项传递。