346

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

4

7 回答 7

341

要调用试运行

make -n

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

于 2011-04-28T14:40:03.733 回答
201

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

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

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

于 2011-04-28T14:44:34.333 回答
193

构建系统独立方法

make SHELL='sh -x'

是另一种选择。样品Makefile

a:
    @echo a

输出:

+ echo a
a

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

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

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

这样做sh -v也很酷,但 Dash 0.5.7 (Ubuntu 14.04 sh) 忽略了-c命令(这似乎是它的make使用方式),所以它什么也不做。

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

CMake 生成的 Makefile 始终支持VERBOSE=1

如:

mkdir build
cd build
cmake ..
make VERBOSE=1

专用问题:将 CMake 与 GNU Make 一起使用:如何查看确切的命令?

于 2015-08-14T13:12:26.770 回答
31

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

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

或者

makefile:12: update target 'foo' due to: bar
于 2016-05-21T21:45:06.367 回答
22

利用make V=1

这里的其他建议:

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

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

于 2018-06-22T21:39:01.740 回答
14

我喜欢使用:

make --debug=j

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

--debug[=标志]

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

于 2018-04-02T15:45:23.347 回答
11

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

make AM_DEFAULT_VERBOSITY=1

参考:AM_DEFAULT_VERBOSITY

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

于 2018-05-18T10:49:27.887 回答