簡體   English   中英

Makefile:gcc 行不顯示

[英]Makefile: gcc line does not show up

如果我使用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,基於 gcc 5.2,但我認為這種行為是相同的。

你看到的是正常的。 無論COMMAND是什么, COMMAND &> FILE執行COMMAND並將其標准和錯誤輸出重定向到文件FILE 但是在您的情況下COMMAND是一個編譯命令,如果沒有錯誤或警告,您的編譯器不會在 stdout 或 stderr 上打印任何內容。 因此,重定向到您的日志文件的內容根本就沒有。

你可以很容易地檢查這個:

$ echo 'int main(void) { return 0; }' > foo.c
$ gcc -o foo foo.c
$

看? 沒有任何類型的輸出可以發送到日志文件。

而如果你make -n它是 make (不是你的編譯器)回顯它會在沒有 -n 選項的情況下傳遞給 shell 的配方。 如果你想記錄你的配方,你必須自己在另一個配方中回顯它們,例如,將其 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)

(如果要在將配方傳遞給 shell 時回顯配方,請刪除前導@ )。

注意變量賦值運算符 ( = )。 不要使用簡單的賦值運算符 ( := ),由於超出此問題范圍的原因,它不起作用。

請注意,默認情況下, make 會回顯配方(如果您沒有添加@ )。 因此,您也可以重定向 make 的輸出:

$ cat Makefile
foo: foo.c
    $(CC) $(CFLAGS) -o $@ $<
$ make &> log_file
$ cat log_file
gcc -o foo foo.c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM