嗨,我有这个makefile:
main.o:main.c functionsLab1.c functionsLab1.h gcc -c main.c functionsLab1.o: functionsLab1.c functionsLab1.h gcc-c functionsLab1.c
现在,当我运行命令“make”时,它只执行makefile中的第一个命令。我怎么能一次运行所有的命令?提前感谢:)我尝试键入“make all”命令,但显示错误。
5sxhfpxr1#
make能够编译你所需要的,但前提是你告诉它正确的依赖关系。特别是,你当前的Makefile在依赖关系上撒谎了,因为main.o根本不依赖functionsLab1.c。相反,你试图编译的最终可执行文件依赖于functionsLab1.o。你可能会把你的整个Makefile:
make
main.o
functionsLab1.c
functionsLab1.o
main: main.o functionsLab1.o
(Yes这忽略了对头文件的依赖,但应该对您有效。让make使用它的默认规则;如果你想加入头依赖项,可以这样做:
main: main.o functionsLab1.o main.o: main.c functionsLab1.h functionsLab1.o: functionsLab1.c functionsLab1.h
如果出于某种原因,你真的想明确表达(你不想!),你可以这样做:
main: main.o functionsLab1.o $(CC) -o $@ $? # Warning: incomplete. See note below main.o: main.c functionsLab1.h functionsLab1.o: functionsLab1.c functionsLab1.h
同样,让make使用它的默认规则来构造目标文件。您 * 可以 * 覆盖默认规则,但很少有理由这样做。实际上,这是一个很好的例子,尝试覆盖默认规则会给您带来次优的方案。默认规则可能类似于$(CC) $(LDFLAGS) -o $@ $? $(LOADLIBES) $(LDLIBS),并且许多用户会合理地期望能够指定LDLIBS。上面显示的示例忽略了LDLIBS,违反了最小意外原则。
$(CC) $(LDFLAGS) -o $@ $? $(LOADLIBES) $(LDLIBS)
1条答案
按热度按时间5sxhfpxr1#
make
能够编译你所需要的,但前提是你告诉它正确的依赖关系。特别是,你当前的Makefile在依赖关系上撒谎了,因为main.o
根本不依赖functionsLab1.c
。相反,你试图编译的最终可执行文件依赖于functionsLab1.o
。你可能会把你的整个Makefile:(Yes这忽略了对头文件的依赖,但应该对您有效。让
make
使用它的默认规则;如果你想加入头依赖项,可以这样做:如果出于某种原因,你真的想明确表达(你不想!),你可以这样做:
同样,让
make
使用它的默认规则来构造目标文件。您 * 可以 * 覆盖默认规则,但很少有理由这样做。实际上,这是一个很好的例子,尝试覆盖默认规则会给您带来次优的方案。默认规则可能类似于$(CC) $(LDFLAGS) -o $@ $? $(LOADLIBES) $(LDLIBS)
,并且许多用户会合理地期望能够指定LDLIBS。上面显示的示例忽略了LDLIBS,违反了最小意外原则。