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


当前回答

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

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

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

其他回答

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

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

or

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

进行预演:

make -n

这将显示make试图做什么。

我喜欢用:

make --debug=j

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

——debug黑= FLAGS铝

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

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

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

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

如果你想看到默认目标运行的所有命令(包括编译后的命令):

make --always-make --dry-run
make -Bn

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

make --dry-run
make -n

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