【问题标题】:Makefile: Why can't I see compilation output?Makefile:为什么我看不到编译输出?
【发布时间】:2012-03-19 22:15:40
【问题描述】:

我有一个主 Makefile 在目录中调用 submakefile。 这些子makefile 是由自动工具从Makefile.amconfigure.ac 文件开始生成的。

整个项目的第一个目标是一个共享库,而其他的都是链接到它的可执行文件(因此在主Makefile中有一个依赖项)。

问题是我只能看到共享库的编译输出,而其他项目只是打印警告和错误(我相信只是stderr文本)。

我不明白是什么导致了这种行为,因为所有项目都是从主 Makefile 中的相同规则调用的,并且所有子makefile 都是从看起来非常相似的配置文件自动生成的。

编译所有目标的masterMakefile的sn-p如下所示:

SUBDIRS = libMylib app1 app2 app3

$(SUBDIRS):
    $(ECHO) "-> Building $@"
    $(MAKE) -C $@
    $(ECHO) "-> Build of $@ finished."

“libMylib”的输出是这样的:

-> Building libMylib
libtool: compile:  ppc-linux-gcc -DHAVE_CONFIG_H -I. -I/opt/ELDK/ppc_8xx/usr/include/ -I/opt/ELDK/ppc_8xx/include/ -Wall -std=gnu99 -O2 -MT libMylibF1.lo -MD -MP -MF .deps/libMylibF1.Tpo -c libMylibF1.c  -fPIC -DPIC -o .libs/libMylibF1.o
...
libtool: link: ppc-linux-gcc -shared  -fPIC -DPIC  .libs/libMylibF1.o .libs/libMylibF2.o .libs/libMylibF3.o -Wl,-rpath -Wl,/opt/ELDK/ppc_8xx/lib -Wl,-rpath -Wl,/opt/ELDK/ppc_8xx/lib -lz -lpthread  -O2   -Wl,-soname -Wl,libMylib.so.0 -o .libs/libMylib.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libMylib.so.0" && ln -s "libMylib.so.0.0.0" "libawmg.so.0")
libtool: link: (cd ".libs" && rm -f "libMylib.so" && ln -s "libMylib.so.0.0.0" "libMylib.so")
libtool: link: ( cd ".libs" && rm -f "libMylib.la" && ln -s "../libMylib.la" "libMylib.la" )
-> Build of libAwmg finished.

而任何“appN”的输出是:

-> Building app1
app1F1.c: In function `app1F1Func1':
app1F1.c:161: warning: unused variable `varA'
app1F2.c:85: warning: `app1F2FuncX' defined but not used
-> Build of app1 finished.

谁能帮帮我?


编辑:

我发现我能够在“libMylib”中看到编译内容,因为它是“libtoolized”。 如果我“libtoolize”另一个项目,我可以看到输出的链接器部分 (libtool: link:...)。

所以,考虑到 make 为规则中的每一行调用一个 shell (sh),$(MAKE) 等于“make”,默认情况下,make 是冗长的,为什么submake 没有将其输出打印到标准输出?

可以将哪些标志传递给它以便发生这种情况?

【问题讨论】:

    标签: makefile gnu-make automake


    【解决方案1】:

    这取决于子目录中的 Makefile。例如,如果您在应用程序 Makefiles 中的编译命令前面有一个 @,那么它们将不会输出正在运行的命令(还要查找 $(Q),当您要启用时,它很常用/禁用生成文件中的冗长性)。或者,您在应用程序目录中的 make 命令可能会将标准输出推送到某些文件(这仍然可以让您看到警告)。

    出于同样的原因,您的库 makefile 可能错误地将 stderr 重定向到其他地方,这可以解释为什么您看不到任何错误输出(或者它只是没有任何错误...)

    如果您需要更多帮助,请在其他目录(以及所有关联的变量定义)中发布构建规则。

    【讨论】:

    • submakefiles 是由 autoconf/automake 生成的,所以有点冗长(这也是我没有贴出来的原因)。如果我直接在终端中运行它,我会看到预期的输出。只有从主 Makefile 调用时才会发生这种情况。请看我上面的编辑...
    【解决方案2】:

    嗯,我的主 makefile 包含另一个文件,其中包含 .SILENT 规则。

    直到今天我才注意到这一点。 删除此规则后,一切都将按预期进行。

    天哪……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2021-10-25
      • 2011-05-06
      • 2011-10-19
      • 1970-01-01
      • 2018-09-13
      相关资源
      最近更新 更多