如何强制make/GCC向我显示命令?

如何强制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' /

我试图调试一个编译问题,但我似乎无法让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
试图执行的操作。

由自动工具生成的库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.04
sh
)忽略了
-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
    -也可以工作,但也可能启用多线程构建,从而导致额外的输出



您是在运行makefile,还是仅仅运行一个
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的编写/生成情况。如果有人能解释否决票,请告诉我,以便我可以了解并改进信息;-)make
SHELL='$$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