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

14 浏览
0 Comments

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

我使用CMake和GNU Make,并希望能够准确地查看所有命令(例如编译器的执行方式,所有标志等)。

GNU make有--debug选项,但似乎并不是很有用,是否还有其他选项?CMake在生成的Makefile中是否提供了用于调试的附加标志?

0
0 Comments

问题的出现原因:

在使用CMake和GNU Make时,想要查看精确的构建命令,即构建过程中执行的每个命令的详细输出。然而,CMake默认情况下不会显示这些详细输出,因此需要找到一种方法来打开此选项。

解决方法:

CMake提供了一个选项CMAKE_VERBOSE_MAKEFILE,可以通过在CMakeLists.txt文件中设置该选项来打开详细输出。具体方法是在CMakeLists.txt文件中添加以下代码:

set(CMAKE_VERBOSE_MAKEFILE ON)

然而,尽管这是一种方便的方法,但并不建议将其应用于自己的项目。并非所有用户都希望看到详细的构建输出,因此不要强制将此选项应用于使用您的库的所有人。相反,CMAKE_VERBOSE_MAKEFILE应该默认关闭,并由用户根据需要进行选择,仅用于调试目的。

如果有多个开发人员并且希望给他们选择的机会,可以将CMAKE_VERBOSE_MAKEFILE作为缓存变量添加。但是,在项目的发布版本中,默认情况下应该关闭该选项。

需要注意的是,当使用qt.io QtCreator时,这个选项非常有用,因为cmake是由GUI调用的。

通过在CMakeLists.txt文件中设置CMAKE_VERBOSE_MAKEFILE选项,可以在使用CMake和GNU Make时查看精确的构建命令。然而,应该谨慎使用此选项,并根据项目的需求和用户的偏好进行设置。

0
0 Comments

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

在运行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

这些解决方案会使输出过于冗长,打印了许多不重要的CMake和make内部信息。是否有办法只显示编译和链接命令(即通常与调试问题相关的内容)。甚至只显示失败的命令。

顶部的谷歌搜索结果建议"如果你只想看到g++命令行,应该使用grep和相关工具 - 如果可能的话 - 结合详细的Makefile"。也许具有许多CMake经验的开发人员有其他建议。

顺便说一句,如果您在支持的平台上,cmake -GNinja . ; ninja -v会显示非常好的详细输出,没有多余的内容。

单行命令... cmake --build . -- VERBOSE=1

显然,我必须使用较新的CMake版本,因为在运行cmake后,在我的构建目录中找不到任何makefile...

好了,找到了:需要使用生成"Unix Makefiles"的cmake命令:cmake .. -G"Unix Makefiles"

第二次来这里,我想再次为这个答案投票)

还可以使用-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,在这种情况下,我们将所有命令保存在compile_commands.json文件中,而不实际构建源文件。

-DCMAKE_VERBOSE_MAKEFILE:BOOL=ONClion中适用,cmake版本为3.20+。

0
0 Comments

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

在使用CMake和GNU Make时,有时候我们希望能够查看生成的Makefile中所执行的确切命令。下面介绍了解决这个问题的原因和方法。

问题的原因:

默认情况下,CMake生成的Makefile会隐藏大部分的命令,只显示高层次的信息。这样做是为了减少终端输出的冗杂和提高可读性。然而,在某些情况下,我们可能需要查看确切的命令,以便调试和排查问题。

解决方法:

我们可以通过设置VERBOSE环境变量来查看确切的命令。具体方法如下:

1. 在终端中执行以下命令来设置VERBOSE环境变量:

export VERBOSE=1

2. 在Windows系统中,可以通过设置环境变量VERBOSE为1来实现。这对于MSVC和MinGW都适用。如果想要撤销这个设置,需要将VERBOSE设置为空,而不是0。

通过以上方法设置VERBOSE环境变量后,重新运行CMake生成Makefile,就可以看到确切的命令了。

通过设置VERBOSE环境变量,我们可以查看CMake生成的Makefile中所执行的确切命令。这对于调试和排查问题非常有帮助。在终端中执行export VERBOSE=1命令或在Windows系统中设置环境变量VERBOSE为1即可实现。

0