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

lyfkaqu1  于 2022-11-24  发布在  其他
关注(0)|答案(8)|浏览(186)

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

dw1jzc5e

dw1jzc5e1#

调用模拟运行

make -n

这将显示make尝试执行的操作。

jdzmm42g

jdzmm42g2#

建置系统独立方法

make SHELL='sh -x'

是另一个选项。示例Makefile

a:
    @echo a

输出量:

+ echo a
a

这将为make设置特殊的SHELL变量,并且-x告诉sh在执行之前打印展开的行。
相对于-n的一个优点是它实际上运行命令。我发现对于一些项目(eidogg. 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

专用问题:Using CMake with GNU Make: How can I see the exact commands?

to94eoyn

to94eoyn3#

由autotools生成的库makefile(您必须发出的./configure)通常有一个verbose选项,所以基本上,使用make VERBOSE=1make V=1应该可以给予完整的命令。
但这取决于生成makefile的方式。
-d选项可能会有所帮助,但它会给予非常长的输出。

flvtvl50

flvtvl504#

从GNU Make 4.0版开始,--trace参数是一种很好的方式来说明makefile做什么以及为什么做,输出如下行:

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

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

uidvcgyl5#

使用make V=1
其他建议如下:

  • make VERBOSE=1-至少从我的试验来看不起作用。
  • make -n-仅显示逻辑操作,不显示正在执行的命令行。例如CC source.cpp
  • make --debug=j-也可以使用,但也可能启用多线程构建,从而导致额外的输出。
chhkpiq4

chhkpiq46#

我喜欢用途:

make --debug=j

https://linux.die.net/man/1/make
--调试[=标志]
除正常处理外,还打印调试信息。如果省略FLAGS,则行为与指定-d时相同。FLAGS可以是所有调试输出的(与使用-d相同)、b用于基本调试、v用于更详细的基本调试、i用于显示隐式规则、j用于命令调用的详细信息m用于在重新生成makefile时进行调试。

wb1gzix0

wb1gzix07#

根据您的automake版本,您还可以使用以下命令:

make AM_DEFAULT_VERBOSITY=1

参考:* AM_DEFAULT_VERBOSITY *

  • 注:我添加此答案是因为V=1不适用于我。*
mm9b1k5b

mm9b1k5b8#

  • 如果要查看默认目标运行的所有命令(包括已编译的命令):
make --always-make --dry-run
make -Bn
  • 显示下次运行make时将执行的命令:
make --dry-run
make -n

相关问题