使用CMake和GNU Make:我如何能看到准确的命令?

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

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

222195 次浏览

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

cmake .
make VERBOSE=1

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

cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON .
make

为了减少一些可能不太有趣的输出,您可能会使用以下选项。选项CMAKE_RULE_MESSAGES=OFF删除了像[33%]建筑C对象…这样的行,而--no-print-directory告诉make不打印当前目录,过滤掉像make[1]: Entering directorymake[1]: Leaving directory这样的行。

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 debug

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

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

cmake --build . --verbose

在Linux和Makefile生成中,这可能只是在底层调用make VERBOSE=1,但是cmake --build对于你的构建系统来说更可移植,例如跨操作系统工作,或者如果你决定稍后进行例如Ninja构建:

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

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

——详细- v

启用详细输出(如果支持),包括要执行的构建命令。

如果设置了详细的环境变量或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.