gcc - Makefile:gcc 行不显示
问题描述
如果我运行该行make target_name
:
$(CC) $(CFLAGS) $(OPTS) $(TARGET) &> gcc_log_file
我在 gcc_log_file 中得到以下结果:没什么奇怪的,因为如果我键入 make -n target_name
,则该行会很好地扩展。
我可以在 gcc 中添加“-v”,但这会非常难看,我只想扩展 GCC 行...
我尝试了以下解决方法
@echo "$(OBJ) $$($(CC) $(CFLAGS) $(OPTS) $(TARGET))" &> gcc_log_file
@printf "$(OBJ) %s\n" $$($(CC) $(CFLAGS) $(OPTS) $(TARGET)) &> gcc_log_file
执行 CC 行,扩展 $(OBJ) 但不扩展 CC 行...
我应该明确指出我想在 makefile 中执行此操作,因为我不想登录不是由 gcc 生成的 gcc_log_file 行……我的 makefile 非常复杂。
任何提示?
请注意,我的 gcc 是基于 gcc 5.2 的特殊 gcc,但我认为这种行为是相同的。
解决方案
你看到的很正常。不管COMMAND
是什么,COMMAND &> FILE
执行COMMAND
并将其标准和错误输出重定向到 file FILE
。但在您的情况下COMMAND
是一个编译命令,如果没有错误或警告,您的编译器不会在 stdout 或 stderr 上打印任何内容。因此,重定向到您的日志文件的内容根本不是什么。
你可以很容易地检查这个:
$ echo 'int main(void) { return 0; }' > foo.c
$ gcc -o foo foo.c
$
看?没有可以发送到日志文件的任何类型的输出。
而如果你make -n
是 make (不是你的编译器),它会在没有 -n 选项的情况下回显它会传递给 shell 的配方。如果您想记录您的配方,您必须自己在另一个配方中回显它们,例如,echo
将其外壳扩展参数发送到标准输出的命令:
target: prerequisites
@echo "COMMAND" >> log_file
COMMAND
例子:
foo: foo.c
@echo '$(CC) $(CFLAGS) -o $@ $<' >> log_file
$(CC) $(CFLAGS) -o $@ $<
如果您不想两次键入相同的命令,您可以声明一个 make 变量:
COMPILATION = $(CC) $(CFLAGS) -o $@ $<
foo: foo.c
@echo '$(COMPILATION)' >> log_file
$(COMPILATION)
或者,一次全部:
COMPILATION = $(CC) $(CFLAGS) -o $@ $<
ECHOCOMPILE = echo '$(COMPILATION)' >> log_file; $(COMPILATION)
foo: foo.c
@$(ECHOCOMPILE)
@
(如果您想在将配方传递给外壳时回显配方,请删除前导)。
注意变量赋值运算符 ( =
)。不要使用简单的赋值运算符 ( :=
),因为超出此问题范围的原因,它不起作用。
请注意,默认情况下, make 会回显配方(如果您不预先添加 a @
)。所以,你也可以重定向 make 的输出:
$ cat Makefile
foo: foo.c
$(CC) $(CFLAGS) -o $@ $<
$ make &> log_file
$ cat log_file
gcc -o foo foo.c
推荐阅读
- python - 如果语句问题打印所有短语
- cuckoo - 没有pip2怎么下载
- mysql - 如何根据具有特定值的字段逐行递增 id
- list - 从 Firestore Flutter 中读取子集合
- javascript - React.memo 不适用于功能组件。如果我所看到的不支持该功能,那么优化的另一种方法是什么?
- python - OpenCV Python:如何将图像叠加到另一个图像的中心
- c# - Asp.net core 3.0 在发布或构建时发布视图文件 (.cshtml)
- sql - 这段代码是什么意思..[select @a:=password(?)]
- javascript - 如何在从另一个页面加载的模式中运行脚本?
- python-3.x - pyaudio 在录制声音时给出空输出文件 [MacOS Mojave 10.14.6]