如何强制make/GCC向我显示命令?
我试图调试一个编译问题,但我似乎无法让GCC(或者它可能是make??)显示它正在执行的实际编译器和链接器命令 以下是我看到的输出:如何强制make/GCC向我显示命令?,gcc,makefile,verbosity,Gcc,Makefile,Verbosity,我试图调试一个编译问题,但我似乎无法让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' /
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
试图执行的操作。由自动工具生成的库makefile(您必须发出的/configure
)通常具有详细选项,因此基本上,使用make verbose=1
或make V=1
可以为您提供完整的命令
但这取决于生成文件的方式
-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.04sh
)忽略了-c
命令(这似乎是make
使用它的方式),所以它什么都不做
make-p
也会让您感兴趣,它会打印设置变量的值
CMake生成的makefile始终支持VERBOSE=1
例如:
mkdir build
cd build
cmake ..
make VERBOSE=1
专用问题:自从GNU制作了4.0版以来,
--trace
参数是一种很好的方法,可以告诉您makefile做什么以及为什么要做,输出如下行:
makefile:8: target 'foo.o' does not exist
或
我喜欢使用:
make --debug=j
--调试[=标志]
除正常处理外,还打印调试信息。如果省略标志,则行为与指定了
-d
时相同。标志可以是所有调试输出的a(与使用-d
相同),b
用于基本调试,v
用于更详细的基本调试,i
用于显示隐式规则,j
用于命令调用的详细信息,和m
用于在重新生成生成文件时进行调试。根据您的自动生成版本,您还可以使用以下选项:
make AM_DEFAULT_VERBOSITY=1
参考:
注意:我添加了这个答案,因为
V=1
对我不起作用。使用make V=1
其他建议如下:
-至少在我的试验中不起作用make VERBOSE=1
-仅显示逻辑操作,不显示正在执行的命令行。例如,make-n
CC source.cpp
-也可以工作,但也可能启用多线程构建,从而导致额外的输出make--debug=j
gcc
命令?这看起来像是命令或输出。尝试make V=1
。相关:相反的问题找到了:)make V=1,尽管上面的“make-n”建议同样有效:谢谢大家的回复。区别在于make-n
不执行命令。因此正确的答案是makev=1
makev=1
只有在Makefile支持的情况下才起作用。automake的makefiles可以做到这一点,但其他许多公司却不能做到。对于CMake,请使用make VERBOSE=1
;对于GNU自动工具<代码>使V=1</代码>.@ M- RIC,如果您想运行命令,请考虑<代码>使shell =“SH -X′/代码>:注:CGED生成的MaFIX文件只支持<代码> VBOSE=1 ,而不是<代码> V=1 < /代码>。V=1为我工作,用MIPS Linux NGTU GNU GCC编译NUTTX,谢谢。这绝对是最好的答案,不取决于原始Makefile的编写/生成情况。如果有人能解释否决票,请告诉我,以便我可以了解并改进信息;-)makeSHELL='$$SHELL-x'
将生成未计算的$SHELL
文本。使用make SHELL=“$SHELL-x”
将有效。这是最好的通用答案,与其他一些答案相比,这并不取决于使用cmakemake SHELL='sh-x'是超级!此参数打印的信息比干运行更详细。了解具有复杂构建过程(如dpdk)的make系统非常有帮助。@makerj:可能,但它确实执行命令,而不像make-n
,make VERBOSE=1
是用于CMake的。您的测试很可能是基于GNU autotools的项目。它不一定显示它执行的命令。您可能只需要获得Reaping winding child xyz
和Jobserver客户端(fds 3,4)
和需要一个作业令牌;我们没有孩子
等等。同意,@einpoklum。只有在您使用GNU autotools/automake的情况下才可以这样做。
make AM_DEFAULT_VERBOSITY=1