ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
链接器使用标准 C 预处理器来预处理链接器命令文件。因此,命令文件可以包含众所周知的预处理指令,例如 #define、#include 和 #if / #endif。
三个链接器选项控制着预处理器:
--disable_pp | 禁用命令文件预处理 |
--define=name[=val] | 将 name 预定义为预处理器宏 |
--undefine=name | 删除宏 name |
编译器具有含义相同的 --define 和 --undefine 选项。但是,链接器选项不同;只有在 --run_linker 之后指定的 --define 和 --undefine 选项会传递给链接器。例如:
armcl --define=FOO=1 main.c --run_linker --define=BAR=2 lnk.cmd
链接器只能看到 BAR 的 --define;编译器只能看到 FOO 的 --define。
当一个命令文件包含 (#include) 另一个命令文件时,预处理上下文以常规方式从父级传递到子级(即,在父级定义的宏在子级中可见)。但是,当不是通过 #include 来调用命令文件时,无论是在命令行中还是通过在另一个命令文件中进行指定的常规方式,预处理上下文都不会传递到嵌套的文件中。 例外情况是 --define 和 --undefine 选项,这些选项是从遇到的位置开始全局应用。例如:
--define GLOBAL
#define LOCAL
#include "incfile.cmd" /*看到 GLOBAL 和 LOCAL */
nestfile.cmd /* 仅看到 GLOBAL */
在命令文件中使用 --define 和 --undefine 时有两点注意事项。首先,它们具有如上所述的全局影响。其次,它们本身实际上并不是预处理指令,因此它们会被宏替换,进而可能会产生意想不到的后果。为了消除这种影响,可以在符号名称外添加引号。例如:
--define MYSYM=123
--undefine MYSYM /* 扩展到 --undefine 123 (!)*/
--undefine "MYSYM" /* 啊,这样更好 */
链接器按照以下顺序搜索 #include 文件,直到找到该文件:
有两个例外:相对路径名(如“../name”)总是相对于当前目录进行搜索;绝对路径名(例如“/usr/tools/name”)完全绕过搜索路径。
链接器提供了表 8-10 中列出的内置宏定义。链接器中这些宏的可用性取决于所使用的命令行选项,而不是所链接文件的构建属性。如果这些宏未按预期设置,请确认工程命令行使用了正确的编译器选项设置。
宏名称 | 说明 |
---|---|
__DATE__ | 扩展到 mmm dd yyyy 形式的编译日期 |
__FILE__ | 扩展到当前源文件名 |
__TI_COMPILER_VERSION__ | 已定义为 7-9 位整数,具体取决于 X 是 1、2 还是 3 位。该数字不包含小数。例如,版本 3.2.1 表示为 3002001。去掉前导零以防止数字被解释为八进制。 |
__TI_EABI__ | 如果启用了 EABI,则已定义为 1;否则未定义。 |
__TI_ ARM__ | 始终已定义 |
__TI_ ARM_V4__ | 如果目标是 v4 架构 (ARM7)(使用 -mv4 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V5__ | 如果目标是 v5E 架构 (ARM9E)(使用 -mv5e 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V6__ | 如果目标是 v6 架构 (ARM11)(使用了 -mv6 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V6M0__ | 如果目标是 v6M0 架构 (Cortex-M0)(使用了 -mv6M0 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V7__ | 如果目标是任意 v7 架构 (Cortex),则定义为 1;否则未定义。 |
__TI_ ARM_V7A8__ | 如果目标是 v7A8 架构 (Cortex-A8)(使用 -mv7A8 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V7M__ | 如果目标是任何 Cortex-M 架构,则已定义为 1;否则未定义。 |
__TI_ ARM_V7M3__ | 如果目标是 v7M3 架构 (Cortex-M3)(使用了 -mv7M3 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V7M4__ | 如果目标是 v7M4 架构 (Cortex-M4)(使用了 -mv7M4 选项),则已定义为 1;否则未定义。 |
__TI_ ARM_V7R4__ | 如果目标是 v7R4 架构 (Cortex-R4)(使用 -mv7R4 选项),则已定义为 1;否则未定义。 |
__TIME__ | 扩展到“hh:mm:ss”形式的编译时间 |