当我使用;gcc“;在makefile中,制作完成后,我得到了一个;cc";输出

当我使用;gcc“;在makefile中,制作完成后,我得到了一个;cc";输出,c,linux,gcc,makefile,C,Linux,Gcc,Makefile,例如: 目录中有3个源文件{main.ctest1.ctest2.c} 以及名为test3的目录文件, 在test3目录中有一个名为test.c的源文件 现在我想创建一个makefile来编译和链接这四个源文件 这是我的Makefile: # Cancel statement "CC=gcc" src:=$(wildcard *.c) test3.c obj:=$(patsubst %.c,%.o,$(src)) main:$(obj) gcc -o main $(obj) .PH

例如:

目录中有3个源文件{
main.c
test1.c
test2.c
} 以及名为
test3
的目录文件, 在
test3
目录中有一个名为
test.c
的源文件

现在我想创建一个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
我知道在Linux中,“cc”链接到“gcc”


我不明白的是,为什么调用
cc
来编译这四个源文件,而调用
gcc
来链接目标文件?

您更改了一条规则:从目标文件链接程序
main
。当make创建该链接时,您可以看到它被使用
gcc


您没有更改make用于编译对象文件的内置规则,因此它们使用默认值(变量
CC
)即
CC

您更改了一条规则:从对象文件链接程序
main
。当make创建该链接时,您可以看到它被使用
gcc


您没有做任何更改make用于编译对象文件的内置规则,因此它们使用默认值(变量
CC
)即
CC
,您只编写了链接对象文件的规则,并允许Make使用其默认规则来决定如何从源文件构建对象文件

如果您使用
--打印数据库
,GNU Make将公开其规则。在这种情况下,它告诉我们

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

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 *~

您只编写了链接对象文件的规则,并允许Make使用其默认规则来决定如何从源文件构建对象文件

如果您使用
--打印数据库
,GNU Make将公开其规则。在这种情况下,它告诉我们

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

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 *~

我强烈建议您通过将
*o
更改为
*.o
来修改您的
clean
目标。谢谢。我犯了一个错误。Read我强烈建议您通过将
*o
更改为
*.o
来修改您的
clean
目标。谢谢。我犯了一个错误。请阅读如果问题已回答,请单击答案旁边的复选标记,使其显示为“已回答”。如果问题已回答,请单击答案旁边的复选标记,使其显示为“已回答”。