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


进行预演:

make -n

这将显示make试图做什么。


库生成文件是由autotools生成的(必须发出的./configure),通常有一个verbose选项,因此基本上,使用make verbose =1或make V=1应该会提供完整的命令。

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

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


构建独立于系统的方法

make SHELL='sh -x'

是另一种选择。示例Makefile:

a:
    @echo a

输出:

+ echo a
a

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

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

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

执行sh -v也很酷,但Dash 0.5.7 (Ubuntu 14.04 sh)忽略了for -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

or

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

我喜欢用:

make --debug=j

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

——debug黑= FLAGS铝

打印除正常处理外的调试信息。如果省略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

显示下一次执行make命令时执行的命令:

make --dry-run
make -n

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