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

her*_*ejj 250 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
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

chr*_*ock 252

要调用干运行:

make -n
Run Code Online (Sandbox Code Playgroud)

这将显示make正在尝试做的事情.

  • 区别在于`make -n`不执行命令.因此,正确的答案是"使V = 1" (73认同)
  • 对于CMake,使用`make VERBOSE = 1`; 对于GNU autotools`make V = 1`. (48认同)
  • 发现它:)使V = 1虽然上面提出的"make -n"也有效.:)谢谢大家的回复. (28认同)
  • `make V = 1`仅在Makefile支持时才有效.automake的makefiles做到了这一点,但许多其他人没有. (19认同)
  • @ m-ric如果你想运行实际运行命令,请考虑`make SHELL ='sh -x'`:http://stackoverflow.com/a/32010960/895245 (9认同)

Gui*_*i13 160

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

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

-d选项可能有所帮助,但会给你一个非常长的输出.

  • 注意:CMake生成的Makefile仅支持`VERBOSE = 1`,而不支持'V = 1`. (56认同)
  • -d给出mega输出,但不是实际的命令运行. (4认同)
  • V = 1对我有用,用mips-linux-gnu-gcc编译nuttx,谢谢。 (3认同)

Cir*_*四事件 127

构建系统独立方法

make SHELL='sh -x'
Run Code Online (Sandbox Code Playgroud)

是另一种选择.样品Makefile:

a:
    @echo a
Run Code Online (Sandbox Code Playgroud)

输出:

+ echo a
a
Run Code Online (Sandbox Code Playgroud)

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

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

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

做得sh -v也会很酷,但是Dash 0.5.7(Ubuntu 14.04 sh)忽略了-c命令(这似乎是如何make使用它)所以它什么都不做.

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

CMake生成了Makefile

make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)

请参阅:在GNU Make中使用CMake:如何查看确切的命令?

  • 绝对是最好的答案,它不依赖于原始Makefile的编写/生成程度 (10认同)
  • 如果有人可以解释不赞成票,请告诉我,以便我学习和改进信息;-) (2认同)
  • 使SHELL ='sh -x'超级! (2认同)

Jul*_*ard 19

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

makefile:8: target 'foo.o' does not exist
Run Code Online (Sandbox Code Playgroud)

要么

makefile:12: update target 'foo' due to: bar
Run Code Online (Sandbox Code Playgroud)

  • 此参数打印比试运行更详细的信息。了解像 dpdk 这样具有复杂构建过程的 make 系统非常有帮助。 (2认同)

Tar*_*aro 14

使用 make V=1

其他建议如下:

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

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

  • make VERBOSE = 1是用于CMake的。您的试验最有可能在基于GNU autotools的项目中进行。 (2认同)

San*_*rte 8

我喜欢使用:

make --debug=j
Run Code Online (Sandbox Code Playgroud)

它显示了它执行的命令:

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

--debug [= FLAGS]

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

  • 它不一定显示它执行的命令。您可能只会得到“收获获胜孩子 xyz”和“Jobserver 客户端(fds 3,4)”和“需要工作令牌;我们没有孩子等等。 (2认同)

Ru *_*sha 5

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

make AM_DEFAULT_VERBOSITY=1
Run Code Online (Sandbox Code Playgroud)

参考:AM_DEFAULT_VERBOSITY

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