使用CMake和GNU Make:如何查看确切的命令?

355
我使用GNU Make和CMake,并且想要查看所有命令的详细信息(例如编译器如何执行,所有标志等)。
GNU make有--debug选项,但它似乎并没有那么有用,还有其他选项吗? CMake在生成的Makefile中提供了额外的调试标志吗?

2
或者,为了添加一些搜索词,如何隐藏完整的冗长执行命令行并仅显示简洁的安静百分比彩色输出。 - ulidtko
非 CMake 超集:https://dev59.com/dG025IYBdhLWcg3wvIu2 - Ciro Santilli OurBigBook.com
2
mkdir build; cd build; cmake .. --debug-output; make VERBOSE=1 - parasrish
8个回答

476

在运行 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]: Entering directorymake [1]: Leaving directory这样的行。

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

13
这些解决方案输出了大量的 CMake 和 make 内部信息,这些信息并不有趣。有没有办法仅显示编译和链接命令(即通常与调试问题相关的内容),甚至只显示失败的命令? - Tronic
顶级的谷歌搜索结果建议 "如果你只想看到g++命令行,你应该在可能的情况下使用grep & Co.与详细的Makefiles相结合"。也许有很多CMake经验的开发人员有其他建议。 - Trevor Boyd Smith
13
顺便说一下,如果您使用支持它的平台,“cmake -GNinja .;ninja -v”将显示非常好的详细输出,并且没有多余的内容。 - richq
19
单行翻译:cmake --build . -- VERBOSE=1 意思:使用CMake构建当前目录,并输出详细构建信息。 - letmaik
4
在这种情况下,我们也可以使用-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,这样我们就可以将所有命令记录在compile_commands.json文件中,而不必实际构建源代码。 - fgiraldeau
显示剩余4条评论

105

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

set(CMAKE_VERBOSE_MAKEFILE ON)

8
请不要在你的项目中这样做。并不是所有用户都想看到冗长的构建输出。不要强制让每个使用你的库的人都看到它。CMAKE_VERBOSE_MAKEFILE 应该默认关闭,成为用户根据需要用于调试的选择。 - Ela782
4
如果你有多个开发人员并想要给他们选择权,那么你可以将它作为缓存变量添加。但是,在项目的发布版本中,默认情况下应该关闭它。 - James Hirschorn
1
当使用qt.io QtCreator时,这是一个很好的选择,因为cmake由GUI调用。谢谢! - Grant Rostig

16

或者只需在shell上导出VERBOSE环境变量,像这样:

export VERBOSE=1

1
在Windows上,将环境变量VERBOSE设置为1对于MSVC和MinGW都有效。如果您想撤消此操作,则需要将其设置为空,而不是0 - kbridge4096

12

cmake --build . --verbose

在 Linux 上并且使用 Makefile 生成的情况下,这可能只是在后台调用 make VERBOSE=1 命令,但是 cmake --build 可以更加方便地适用于您的构建系统,例如,在不同的操作系统上或者如果您之后决定进行 Ninja 构建时:

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

它的文档还建议它与VERBOSE=1等效:

--verbose, -v

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

如果设置了VERBOSE环境变量或CMAKE_VERBOSE_MAKEFILE缓存变量,则可以省略此选项。

在Cmake 3.22.1,Ubuntu 22.04上进行测试。


2
未知参数 --verbose - KansaiRobot
@KansaiRobot 我刚在Ubuntu 22.04上测试了Cmake 3.22.1,它可以正常工作。你的cmake版本是多少? - Ciro Santilli OurBigBook.com

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

我如何在不使用GUI的情况下,在文本文件中设置此选项? - osgx

5

我曾试图使用类似的方法确保-ggdb标志存在。

在一个干净的目录中调用make命令并grep您要查找的标志。如果我要查找debug而不是ggdb,我只需编写以下内容:

make VERBOSE=1 | grep debug

-ggdb标志足够模糊,只有编译命令才会出现。


3

CMake 3.14+

CMake现在支持--verbose参数,可以指定详细的构建输出信息。无论使用哪种生成器,该功能都可以正常工作。

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

值得注意的是,Xcode可能无法与--verbose一起使用。

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.

0

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

一些 LSP 需要这个文件来知道如何直接编译源文件,但它也可以帮助调试编译问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接