【问题标题】:in makefile echoing "compiling" before the compilation在编译前在makefile中回显“编译”
【发布时间】:2019-11-26 19:05:49
【问题描述】:

我认为这很容易,但我实际上无法弄清楚也无法在互联网上找到在编译之前宣传“对象文件的编译”(例如)的解决方案,并避免同时重新链接

我的 makefile 会是这样的:

    libfrog.a: $(OBJS)
        @echo "building the library"
        ar -rc $@ $^
    %.o:%.c
        gcc -i. -c -o $@ $<

当提示“make”时产生:

    gcc -I. -c -o file01.o file01.c
    gcc -I. -c -o file02.o file02.c
    gcc -I. -c -o file03.o file03.c
    gcc -I. -c -o file04.o file04.c
    gcc -I. -c -o file05.o file05.c
    building library
    ar -rc libfrog.a file01.o file02.o file03.o file04.o file05.o

但我想要:

    compilation of the objects files
    gcc -I. -c -o file01.o file01.c
    gcc -I. -c -o file02.o file02.c
    gcc -I. -c -o file03.o file03.c
    gcc -I. -c -o file04.o file04.c
    gcc -I. -c -o file05.o file05.c
    building library
    ar -rc libfrog.a file01.o file02.o file03.o file04.o file05.o

现在:

1 - 如果我在调用规则 libfrog.a 之前放置一个回显(比如通过创建另一个第一条规则),即使我提示“make”两次并且什么都不做,它也会打印出来......

2 - 如果我在规则 %.o:%.c 中添加回显,它将为每个文件打印

3 - 如果我将 echo 作为第一条规则的依赖项,它将在再次提示“make”时强制重新链接所有文件,即使只修改了一个文件libfrog.a: echo $(OBJS)(以及规则“echo”回显文本)...

所以我尝试为每个编译回显,但是将文本更改为不回显,我失败了...我尝试创建一个 echo.txt 文件只是为了创建一个取决于其存在的规则但我失败了也。不知道有没有可能?

【问题讨论】:

    标签: makefile echo


    【解决方案1】:

    这并不简单。但是如果你使用的是 GNU make,你可以在 order-only prerequisites 的帮助下做到这一点:

    %.o : %.c | announce
            gcc -I. -c -o $@ $<
    
    .PHONY: announce
    announce:
            echo "compilation of the objects files"
    

    我个人认为不需要显示此消息,我什至不会在我的 makefile 中添加上述复杂性来支持它。

    但是,如果您真的想要这样做,并且除非需要制作一些目标文件,否则您不希望打印消息,那么您将不得不变得非常花哨并执行类似的操作这个:

    PRINTED :=
    
    %.o : %.c
            $(or $(PRINTED),$(eval PRINTED := :)echo "compilation of the objects files")
            gcc -I. -c -o $@ $<     
    

    一旦它开始工作,您需要在第一行食谱之前添加@

    【讨论】:

    • 比我快 8 秒,解决方案与我的相同,只是你使用了引号。
    • 感谢我从未听说过仅订购的先决条件,很高兴知道!但我还有一个小问题:如果我运行“make”两次,第一个会很好,但第二个会打印文本,即使不重新编译..它的行为就像我有第一条规则一样@ 987654325@
    • 在各方面都和all: announce libfrog.a不一样。例如,如果您使用make -j,那么我的版本可以正常工作,而您的版本可能会给出错误排序的输出。此外,如果您运行make libfrog.a,那么我的仍然可以工作,而您的则不能。不管你是对的,它总是会打印该消息。如果没有真的 真的诡计,就没有办法避免这种情况。
    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多