链接描述文件条件包含
linker script conditional includes
我正在将分散文件转换为 linker 文件。现在的问题是 armlink 可以在 link 时接受符号,例如 --predefine=-DSOME_VARIABLE
,并且在分散文件中,其他头文件可以包含在 #include "someHeader.h
指令中。有些文件根据定义的符号包含在分散文件中,例如
#ifdef INCLUDE_RANDOM_FILE
randomFile (*)
#endif
在 linker 脚本中这些选项不可用。是否有解决此问题的方法。
有两个相当简单的选项。
- 使用编译器预处理器并使用输出。
- 颠覆你的逻辑。
在 GCC 或任何编译器中使用 C 预处理器。
$(CC) $(DEFINES) -E -P -o output.lds -x c-header input.lds
此选项允许完整范围的预处理器定义和条件包含。
invert 选项是为您需要的每个案例创建单独的主 'lds' 文件,然后包括公共部分。
flash.lds
start = 0xf000000;
size = 0x100000;
include "common.lds"
ram.lds
start = 0x0;
size = 0x10000;
include "common.lds"
同样可以是production和debug变体。如果排列很低,这是相当容易的。否则,我会使用预处理。
bin-utils ld documentation 也有一个很好的例子 linkcmds.memory 文件。您必须 symlink 或在您的 Makefile
或构建过程中复制 linkcmds.memory 文件。
通过使用 weak
符号和存根文件以及不需要条件的例程,摆脱条件通常非常容易。
我正在将分散文件转换为 linker 文件。现在的问题是 armlink 可以在 link 时接受符号,例如 --predefine=-DSOME_VARIABLE
,并且在分散文件中,其他头文件可以包含在 #include "someHeader.h
指令中。有些文件根据定义的符号包含在分散文件中,例如
#ifdef INCLUDE_RANDOM_FILE
randomFile (*)
#endif
在 linker 脚本中这些选项不可用。是否有解决此问题的方法。
有两个相当简单的选项。
- 使用编译器预处理器并使用输出。
- 颠覆你的逻辑。
在 GCC 或任何编译器中使用 C 预处理器。
$(CC) $(DEFINES) -E -P -o output.lds -x c-header input.lds
此选项允许完整范围的预处理器定义和条件包含。
invert 选项是为您需要的每个案例创建单独的主 'lds' 文件,然后包括公共部分。
flash.lds
start = 0xf000000;
size = 0x100000;
include "common.lds"
ram.lds
start = 0x0;
size = 0x10000;
include "common.lds"
同样可以是production和debug变体。如果排列很低,这是相当容易的。否则,我会使用预处理。
bin-utils ld documentation 也有一个很好的例子 linkcmds.memory 文件。您必须 symlink 或在您的 Makefile
或构建过程中复制 linkcmds.memory 文件。
通过使用 weak
符号和存根文件以及不需要条件的例程,摆脱条件通常非常容易。