我可以在.ld文件中使用预处理程序指令吗? 我需要使用两组.ld文件中的一组,并希望让Build引擎使用宏,我可以这样做吗?
答案 0 :(得分:5)
是的,你可以。您需要为链接器脚本手动运行预处理器,如下所示:
in="your_linker_script.ld"
out="generated_script.ld"
cflags=-Iinclude/
gcc -E -x c $cflags $in | grep -v '^#' >$out
标志:
-E
指定GCC仅运行预处理器-x c
告诉GCC将您的链接描述文件视为C源文件(使用LD脚本运行GCC需要它)或者你可以简单地使用cpp
工具,它实际上是C预处理器。
在此之后,您将能够使用生成的链接描述文件来构建程序(例如,在Makefile中)。
以下是我在项目中解决此问题的方法:
Here是我的链接器脚本使用预处理器(#include
指令和CONFIG_TEXT_BASE
常量)。摘录:
#include <config.h>
Here是生成预处理链接描述文件的脚本。摘录:
gcc -E -x c -Iinclude $cflags $in | grep -v '^#' >>$out
Here是我的Makefile
,它在$(LDS_GEN)
目标(第53行)生成预处理的链接描述文件,这个生成的脚本用于构建结果二进制(第42行)。摘录:
$(LDS_GEN): $(LDS)
build/gen-lds.sh $(LDS) $(LDS_GEN) $(CFLAGS)
$(APP).bin: $(OBJS) $(LDS_GEN)
$(LD) $(OBJS) -T $(LDS_GEN) -o $(APP).elf
答案 1 :(得分:0)
为简化Sam的回答,我将以下内容添加到我的makefile中,然后我们就可以了:)
createTibble <- function(mtcars, i, j) {
is_missing <- missing(j)
mtcars %>% filter(am == i) %>% filter(if(is_missing) TRUE else cyl == j)
}
createTibble(mtcars, 1)
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#4 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#5 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#6 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#7 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#8 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#9 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#10 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
#11 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
#12 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
#13 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
createTibble(mtcars, 1, 4)
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#2 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#3 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#4 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#5 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#6 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#7 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#8 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
答案 2 :(得分:0)
长时间更新。这种预处理方式一直有效,直到内存文件中没有包含欺骗预处理器的行为止。例如:
"KEEP(*path/*.o(.rodata .rodata*))"
路径后的“ / *”被视为注释开始(该行包含被视为C多行注释开始的内容,而不是匹配模式)。
此行对链接器有效,但被视为注释,C预处理程序的输出将删除所有内容,直到找到假定的结束注释:
"KEEP(*path"
生成的文件对于链接器显然无效。我目前没有解决办法。