linux make命令只运行Makefile中的第一行

oalqel3c  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(233)

嗨,我有这个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”命令,但显示错误。

5sxhfpxr

5sxhfpxr1#

make能够编译你所需要的,但前提是你告诉它正确的依赖关系。特别是,你当前的Makefile在依赖关系上撒谎了,因为main.o根本不依赖functionsLab1.c。相反,你试图编译的最终可执行文件依赖于functionsLab1.o。你可能会把你的整个Makefile:

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,违反了最小意外原则。

相关问题