her*_*ejj 250 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'
/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
Run Code Online (Sandbox Code Playgroud)
我想看到的应该与此类似:
$ 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
Run Code Online (Sandbox Code Playgroud)
请注意此示例如何显示完整的gcc命令.以上示例仅显示"CCLD libvirt_parthelper"之类的内容.我不确定如何控制这种行为.
chr*_*ock 252
要调用干运行:
make -n
Run Code Online (Sandbox Code Playgroud)
这将显示make
正在尝试做的事情.
Gui*_*i13 160
由autotools生成的库makefile(./configure
你必须发布)通常有一个冗长的选项,所以基本上,使用make VERBOSE=1
或者make V=1
应该给你完整的命令.
但这取决于makefile的生成方式.
该-d
选项可能有所帮助,但会给你一个非常长的输出.
Cir*_*四事件 127
构建系统独立方法
make SHELL='sh -x'
Run Code Online (Sandbox Code Playgroud)
是另一种选择.样品Makefile
:
a:
@echo a
Run Code Online (Sandbox Code Playgroud)
输出:
+ echo a
a
Run Code Online (Sandbox Code Playgroud)
这将设置特殊SHELL
变量make
,并-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
make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)
请参阅:在GNU Make中使用CMake:如何查看确切的命令?
Jul*_*ard 19
自从GNU Make 4.0版以来,--trace
参数是一个很好的方式来告诉makefile做什么和为什么这样做,输出如下行:
makefile:8: target 'foo.o' does not exist
Run Code Online (Sandbox Code Playgroud)
要么
makefile:12: update target 'foo' due to: bar
Run Code Online (Sandbox Code Playgroud)
Tar*_*aro 14
使用 make V=1
其他建议如下:
make VERBOSE=1
- 至少从我的试验中没有起作用.make -n
- 仅显示逻辑操作,而不显示正在执行的命令行.例如CC source.cpp
make --debug=j
- 也可以,但也可能启用多线程构建,从而产生额外的输出.
我喜欢使用:
make --debug=j
Run Code Online (Sandbox Code Playgroud)
它显示了它执行的命令:
https://linux.die.net/man/1/make
--debug [= FLAGS]
除正常处理外,还打印调试信息。如果省略了FLAGS,则行为与-d
指定的行为相同。FLAGS可以用于所有调试输出(与使用相同-d
),b
用于基本调试,v
用于更详细的基本调试,i
用于显示隐式规则,j
有关命令调用的详细信息以及m
在重新生成makefile时进行的调试。
根据您的自动制作版本,您还可以使用以下命令:
make AM_DEFAULT_VERBOSITY=1
Run Code Online (Sandbox Code Playgroud)
注意:我添加了此答案,因为V=1
它对我不起作用。