使用GNU Make与CMake:我如何查看确切的命令?
问题的出现原因:
在使用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时查看精确的构建命令。然而,应该谨慎使用此选项,并根据项目的需求和用户的偏好进行设置。
使用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 directory
和make[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=ON
在Clion
中适用,cmake版本为3.20+。
使用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即可实现。