如何强制make / gcc向我显示命令?

时间:2011-04-28 14:35:17

标签: gcc makefile verbosity

我正在尝试调试编译问题,但我似乎无法获得GCC(或者可能是make ??)来向我展示它正在执行的实际编译器和链接器命令。这是我看到的输出:

  CCLD   libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1

我想看到的应该与此类似:

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main

注意此示例如何显示完整的gcc命令。以上示例仅显示“CCLD libvirt_parthelper”之类的内容。我不确定如何控制这种行为。

7 个答案:

答案 0 :(得分:223)

调用干跑

make -n

这将显示make正在尝试做什么。

答案 1 :(得分:146)

由autotools生成的库makefile(你必须发出的./configure)通常有一个详细的选项,所以基本上,使用make VERBOSE=1make V=1应该给你完整的命令

但这取决于makefile的生成方式。

-d选项可能会有所帮助,但会为您提供极长的输出。

答案 2 :(得分:116)

构建独立于系统的方法

make SHELL='sh -x'

是另一种选择。示例Makefile

a:
    @echo a

输出:

+ echo a
a

这为SHELL设置了特殊make变量,-x告诉sh在执行之前打印扩展行。

-n的一个优点是实际运行命令。我发现对于某些项目(例如Linux内核)-n可能会因为依赖性问题而比平常更早停止运行。

此方法的一个缺点是您必须确保将使用的shell为sh,这是Make使用的默认shell,因为它们是POSIX,但可以使用{{1更改变量。

执行SHELL也会很酷,但Dash 0.5.7(Ubuntu 14.04 sh -v)会忽略sh命令(这似乎是-c使用它的方式所以它没有做任何事情。

make也会对您感兴趣,它会打印设置变量的值。

CMake生成的Makefile

make -p

请参阅:Using CMake with GNU Make: How can I see the exact commands?

答案 3 :(得分:16)

自GNU Make 4.0版以来,--trace参数是一个很好的方式来告诉makefile做什么和为什么这样做,输出如下行:

makefile:8: target 'foo.o' does not exist

makefile:12: update target 'foo' due to: bar

答案 4 :(得分:10)

使用make V=1

此处的其他建议

  • make VERBOSE=1-至少在我的试用中无效。
  • make -n-仅显示逻辑操作,不显示正在执行的命令行。例如。 CC source.cpp

  • make --debug=j-也可以使用,但也可能启用多线程构建,从而导致额外的输出。

答案 5 :(得分:4)

根据您的automake版本,您也可以使用:

make AM_DEFAULT_VERBOSITY=1

参考:https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html

注意:我添加了这个答案,因为V=1对我不起作用。

答案 6 :(得分:2)

我喜欢使用:

make --debug=j

它显示了它执行的命令:

https://linux.die.net/man/1/make

- 调试[= FLAGS] 除正常处理外,还打印调试信息。如果省略FLAGS,则行为与指定-d的行为相同。 FLAGS可以用于所有调试输出(与使用-d相同),b用于基本调试,v用于更详细的基本调试,i用于显示隐式规则, j用于调用命令的详细信息,以及m用于在重新生成makefile时进行调试。