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


276

我正在尝试调试编译问题,但似乎无法获得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”之类的内容。我不确定如何控制此行为。


您正在运行生成文件,还是仅运行gcc命令?
Blender

20
这看起来像KbuildAutotools输出。尝试make V=1
jww

Answers:


275

调用试运行

make -n

这将显示make正在尝试执行的操作。


30
找到了它:) make V = 1尽管上面的“ make -n”建议也起作用。:)谢谢大家的答复。
hernejj 2011年

75
区别在于make -n不执行命令。因此正确的答案是make V=1
m-ric 2012年

19
make V=1仅在Makefile支持时才有效。automake的makefile可以做到这一点,但其他许多文件却没有。
larsr 2014年

53
对于CMake,请使用make VERBOSE=1;用于GNU自动工具make V=1
Ruslan

10
@ m-ric如果要运行,请实际运行命令,请考虑make SHELL='sh -x'stackoverflow.com/a/32010960/895245
Ciro Santilli郝海东冠状病六四事件法轮功

175

由自动工具(./configure您必须发出)生成的库makefile 通常具有冗长的选项,因此,基本上,使用make VERBOSE=1make V=1应该为您提供完整的命令。

但这取决于生成文件的方式。

-d选项可能会有所帮助,但是它将为您提供非常长的输出。


60
注意:CMake生成的Makefile仅支持VERBOSE=1,而不支持V=1
blinry

3
V = 1对我有用,用mips-linux-gnu-gcc编译nuttx,谢谢。
jcomeau_ictx 2014年

141

建立系统独立方法

make SHELL='sh -x'

是另一种选择。样品Makefile

a:
    @echo a

输出:

+ echo a
a

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

超过一个优点-n是实际上是运行命令。我发现对于某些项目(例如Linux内核),-n可能由于依赖关系问题而可能比平常更早地停止运行。

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

这样做sh -v也很酷,但是Dash 0.5.7(Ubuntu 14.04 sh)忽略了-c命令(这似乎是它的make用法),因此它什么都不做。

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

CMake生成的Makefile

make VERBOSE=1

请参阅:将CMake与GNU一起使用Make:如何查看确切的命令?


11
绝对是最好的答案,而这与原始Makefile的编写/生成方式
无关

2
如果有人可以解释不赞成票,请告诉我,以便我学习和改进信息;-)
西罗·桑蒂利

make SHELL='$$SHELL -x'将生成$SHELL未评估的文字。使用make SHELL="$SHELL -x"将起作用。
里克·范德·泽特

1
与其他不依赖于cmake的答案相比,这是最佳的通用答案
Mike76 '18

2
使SHELL ='sh -x'超级!
成龙

22

从GNU Make 4.0版开始,该--trace参数是一种告诉makefile进行操作的原因,并输出以下内容的好方法:

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

要么

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

1
此参数打印的信息比空运行更为详细。了解具有复杂构建过程(例如dpdk)的make系统非常有帮助。
makerj

19

make V=1

其他建议在这里:

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

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


4
make VERBOSE=1用于CMake。您的试验最有可能在基于GNU autotools的项目中进行。
Ruslan '18

12

我喜欢使用:

make --debug=j

它显示了它执行的命令:

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

--debug [= FLAGS]

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


7

根据您的自动制作版本,您还可以使用以下命令:

make AM_DEFAULT_VERBOSITY=1

参考:AM_DEFAULT_VERBOSITY

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.