当我使用;gcc“;在makefile中,制作完成后,我得到了一个;cc";输出
例如: 目录中有3个源文件{当我使用;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
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
目标。谢谢。我犯了一个错误。请阅读如果问题已回答,请单击答案旁边的复选标记,使其显示为“已回答”。如果问题已回答,请单击答案旁边的复选标记,使其显示为“已回答”。