我如何迫使使/GCC显示我的命令?

我试图调试一个编译问题,但我似乎无法得到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”这样的东西。我不知道该如何控制这种行为。

406265 次浏览

要调用排练:

make -n

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

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

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

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

构建独立于系统的方法

make SHELL='sh -x'

是另一种选择。示例Makefile:

a:
@echo a

输出:

+ echo a
a

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

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

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

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

make -p也会让你感兴趣,它会打印set变量的值。

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

如:

mkdir build
cd build
cmake ..
make VERBOSE=1

专用问题:使用CMake和GNU Make:我如何能看到准确的命令?

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

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

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

我喜欢用:

make --debug=j

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

——调试(=旗帜)

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

根据你的自动版本,你也可以使用这个:

make AM_DEFAULT_VERBOSITY=1

参考:AM_DEFAULT_VERBOSITY

注意:我添加这个答案是因为V=1不适合我。

使用make V=1

其他建议:

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

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

  • 如果你想看到默认目标运行的所有命令(包括编译后的命令):
make --always-make --dry-run
make -Bn
  • show命令执行了make的下一次运行:
make --dry-run
make -n

在本例中,您可以自由选择默认目标以外的目标。