我正在尝试调试编译问题,但我似乎无法获得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”之类的内容。我不确定如何控制这种行为。
答案 0 :(得分:223)
调用干跑:
make -n
这将显示make
正在尝试做什么。
答案 1 :(得分:146)
由autotools生成的库makefile(你必须发出的./configure
)通常有一个详细的选项,所以基本上,使用make VERBOSE=1
或make V=1
应该给你完整的命令
但这取决于makefile的生成方式。
-d
选项可能会有所帮助,但会为您提供极长的输出。
答案 2 :(得分:116)
构建独立于系统的方法
make SHELL='sh -x'
是另一种选择。示例Makefile
:
a:
@echo a
输出:
+ echo a
a
这为SHELL
设置了特殊make
变量,-x
告诉sh
在执行之前打印扩展行。
-n
的一个优点是实际运行命令。我发现对于某些项目(例如Linux内核)-n
可能会因为依赖性问题而比平常更早停止运行。
此方法的一个缺点是您必须确保将使用的shell为sh
,这是Make使用的默认shell,因为它们是POSIX,但可以使用{{1更改变量。
执行SHELL
也会很酷,但Dash 0.5.7(Ubuntu 14.04 sh -v
)会忽略sh
命令(这似乎是-c
使用它的方式所以它没有做任何事情。
make
也会对您感兴趣,它会打印设置变量的值。
CMake生成的Makefile
make -p
请参阅:Using CMake with GNU Make: How can I see the exact commands?
答案 3 :(得分:16)
自GNU Make 4.0版以来,--trace
参数是一个很好的方式来告诉makefile做什么和为什么这样做,输出如下行:
makefile:8: target 'foo.o' does not exist
或
makefile:12: update target 'foo' due to: bar
答案 4 :(得分:10)
使用make V=1
此处的其他建议
make VERBOSE=1
-至少在我的试用中无效。 make -n
-仅显示逻辑操作,不显示正在执行的命令行。例如。 CC source.cpp
make --debug=j
-也可以使用,但也可能启用多线程构建,从而导致额外的输出。
答案 5 :(得分:4)
根据您的automake版本,您也可以使用:
make AM_DEFAULT_VERBOSITY=1
参考:https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html
注意:我添加了这个答案,因为V=1
对我不起作用。
答案 6 :(得分:2)
我喜欢使用:
make --debug=j
它显示了它执行的命令:
https://linux.die.net/man/1/make
- 调试[= FLAGS] 除正常处理外,还打印调试信息。如果省略FLAGS,则行为与指定-d的行为相同。 FLAGS可以用于所有调试输出(与使用-d相同),b用于基本调试,v用于更详细的基本调试,i用于显示隐式规则, j用于调用命令的详细信息,以及m用于在重新生成makefile时进行调试。