我使用CMake和GNU Make,想要确切地看到所有命令(例如编译器是如何执行的,所有的标志等)。

GNU make有——debug,但它似乎没有那么有用还有其他选项吗?CMake是否为调试目的在生成的Makefile中提供额外的标志?


运行make时,添加VERBOSE=1以查看完整的命令输出。例如:

cmake .
make VERBOSE=1

或者您可以在cmake命令中添加-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON,用于生成的makefile的永久详细命令输出。

cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON .
make

为了减少一些可能不太有趣的输出,您可能会使用以下选项。选项CMAKE_RULE_MESSAGES=OFF删除像[33%]Building C object…,而——no-print-directory告诉make不打印当前目录,过滤出像make[1]:进入目录和make[1]:离开目录这样的行。

cmake -DCMAKE_RULE_MESSAGES:BOOL=OFF -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON .
make --no-print-directory

如果您使用CMake GUI,则切换到高级视图,然后该选项被称为CMAKE_VERBOSE_MAKEFILE。


在CMakeLists.txt文件中设置选项是很方便的:

set(CMAKE_VERBOSE_MAKEFILE ON)

我尝试了类似的方法来确保-ggdb标志存在。

在一个干净的目录中调用make并grep您正在寻找的标志。寻找debug,而不是ggdb,我只会写。

make VERBOSE=1 | grep调试

-ggdb标志非常模糊,只弹出编译命令。


或者简单地在shell上导出VERBOSE环境变量,如下所示: 出口VERBOSE = 1


Cmake——构建。——详细

在Linux和Makefile生成中,这可能只是在底层调用make VERBOSE=1,但是cmake——build可以更便于您的构建系统,例如跨操作系统工作,或者如果您决定稍后执行例如Ninja构建:

mkdir build
cd build
cmake ..
cmake --build . --verbose

它的文档还表明它等价于VERBOSE=1:

——详细- v 启用详细输出(如果支持),包括要执行的构建命令。 如果设置了VERBOSE环境变量或CMAKE_VERBOSE_MAKEFILE缓存变量,则可以省略此选项。

在Cmake 3.22.1, Ubuntu 22.04上测试。


cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE将生成一个包含所有编译命令的文件。

一些LSP需要这个文件来了解如何开箱即用地编译源文件,但它也有助于调试编译问题。

输出文件名为${CMAKE_BINARY_DIR}/compile_commands.json。


CMake 3.14 +

CMake现在有——verbose来指定详细的构建输出。不管你的生成器是什么,这都是可行的。

cd project
cmake -B build/
cmake --build build --verbose

值得注意的是,Xcode可能无法使用——冗长

Some generators such as Xcode don't support this option currently.

另一个选项是使用VERBOSE环境变量。

New in version 3.14.

Activates verbose output from CMake and your build tools of choice when you start to actually build your project.

Note that any given value is ignored. It's just checked for existence.