【问题标题】:how to invoke defined targets in the same Makefile?如何在同一个 Makefile 中调用定义的目标?
【发布时间】:2014-08-29 19:28:09
【问题描述】:

这里是 Makefile(Unix Shell)

main : mainFunc.c
    gcc -c -o main.o mainFunc.c
other : otherSum.c
    gcc -c -o other.o otherSum.c
link : other.o main.o
    gcc -o main.out other.o main.o

如何在另一个新目标中调用它们

我试过这样:

doAll : 
    make main
    make other
    make link

确实 main.out 已经构建完成

但还有更多类似“make[1]:离开/进入目录……”的行

我想知道为什么

【问题讨论】:

    标签: shell makefile target


    【解决方案1】:

    这是一个写得很糟糕的makefile。

    main 目标应该是 main.o 以对应于正在创建的文件,而不是一个随机(虚假)目标,只是模糊地与实际工作相关联。

    otherlink 目标也是如此,它们应该分别是 other.omain.out

    可以将这些目标列为doAll 目标(即doAll: main other link)的先决条件,而不是从doAll 目标的主体中手动运行make,并且它们会正确处理它。

    话虽如此,如果我的第一个建议得到遵循并且目标本身得到纠正,那么将 main.oother.o 列为 doAll 的先决条件甚至都没有必要,因为列出 main.out 会自动将目标链接起来正确。

    更进一步,您可以完全摆脱所有这些实际规则,让内置规则为您完成工作。您需要做的就是将main.out 目标重命名为main,完全删除main.oother.o 目标并从main: other.o main.o 目标定义中删除规则主体(使其仅作为先决条件定义)。

    也就是说一个makefile只包含:

    main: other.o main.o
    

    将正确构建您上面的 makefile 正在构建的项目,但没有不必要的 make 重新调用和目标/等的手动链接。使用它,您甚至可以使用内置变量 CFLAGSLDFLAGSLDLIBS 指定自己的编译和链接标志。

    哦,我来回答一下“为什么我会得到“make[1]:leaving/entering the directory ......”这个makefile的问题?

    它与 make 检测递归并试图帮助您了解正在发生的事情有关。您可以使用 --no-print-directory 选项抑制它。

    【讨论】:

    • 感谢您直言不讳的批评!
    • @qweeah 如果语气过于强烈,我们深表歉意。那不是我的本意。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多