簡體   English   中英

當我在makefile中使用“ gcc”時,制作完成后,我得到了“ cc”輸出

[英]When I use “gcc” in makefile, after making it, I got a “cc” output

例如:

有3個源文件{ main.c test1.c test2.c }目錄,並命名目錄文件test3 ,並且有一個名為源文件test.c在目錄test3

現在,我想創建一個makefile來編譯和鏈接這四個源文件。

這是我的Makefile:

# Cancel statement "CC=gcc"

src:=$(wildcard *.c) test3.c
obj:=$(patsubst %.c,%.o,$(src))

main:$(obj)
    gcc -o main $(obj)

.PHONY:clean

clean:
    rm *.o *~

當我調用make進行編譯時,我得到如下輸出:

cc    -c -o main.o main.c
cc    -c -o test1.o test1.c
cc    -c -o test2.o test2.c
cc    -c -o test3.o test3/test3.c
gcc -o main main.o test1.o test2.o test3.o

我知道'cc'在Linux中鏈接到'gcc'。

我不明白的是,為什么Make調用cc來編譯這四個源文件,卻調用gcc來鏈接目標文件?

您更改了一條規則:從目標文件鏈接程序main一條規則。 當make完成該鏈接時,您可以看到它使用了gcc

您無需做任何更改即可更改make用來編譯目標文件的內置規則,因此它們使用默認值(變量CC的值) cc

您僅編寫了鏈接目標文件的規則,並允許Make使用其默認規則來決定如何從源文件構建目標文件。

如果使用--print-data-base詢問,GNU Make將公開其規則。 在這種情況下,它告訴我們

%.o: %.c
#  recipe to execute (built-in):
        $(COMPILE.c) $(OUTPUT_OPTION) $<

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

最后

CC = cc

這解釋了為什么Make使用cc來編譯您的C源代碼。 要更改它,只需設置CC = gcc 這是一個完整的Makefile,它可以執行此操作,還可以充分利用Make的內置規則,以在需要擴展時提供幫助:

src := $(wildcard *.c) test3.c
obj := $(patsubst %.c,%.o,$(src))

CC = gcc

main: $(obj)
    $(LINK.c) -o $@ $^ $(LDLIBS)

.PHONY: clean

clean:
    $(RM) *.o *~

暫無
暫無

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

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