ChatGPT解决这个技术问题 Extra ChatGPT

在执行之前制作 CMake 打印命令

我正在开发一个在 Linux 上使用 CMake 构建的大型 C++ 项目。 CMake 运行良好,在模块和应用程序树中生成大量 Makefile。运行 GNU make 会导致链接器错误。我怎样才能让 make 在运行它们之前打印出确切的命令?

-d 选项不会打印命令,但会打印大量无用的信息。

-n 选项打印所有命令,但不运行它们,所以我不知道问题到底出在哪里。从 make -n 检查标准输出,我没有看到任何相关的命令。我怀疑某些命令会根据早期命令的结果而改变,并且 Makefile 的层次结构使得很难判断到底发生了什么。

我在 make 的手册页中没有看到任何其他看起来有用的选项。


P
Peter Mortensen

我很确定这会奏效:

make VERBOSE=1

您还应该能够将其添加到您的 CMakeLists.txt 以永久设置:

set(CMAKE_VERBOSE_MAKEFILE on)

CMake FAQ 对此进行了介绍。


是的,做到了!接下来要调试的事情:为什么我无法在文档中找到它?
有没有办法,我可以自定义输出?例如,如果我想在编译和链接之间插入自定义回显,例如回显“这是编译结束,现在我们将开始链接”......
我找到了答案-> add_custom_command(TARGET yourtargetname POST_BUILD COMMAND echo "WE HAVE FINISHED COMPILING")
P
Peter Mortensen

对于自动生成的 Makefile,请尝试:

make V=1

不在主题上,问题是关于 cmake,而不是 automake。
T
TrentP

适用于 GNU make 并适用于任何 Makefile(无论是否由 CMake 生成)的选项是使用 --trace 选项进行制作。这将打印出 make 正在执行的命令并仍然执行它们。

这适用于所有命令,而不仅仅是那些 VERBOSE=1V=1 在 CMake/automake 生成的 makefile 中触发打印的命令。

Linux 上的另一种选择是在 strace 下运行 make,如 strace -f -e trace=execve make <make options>。 strace 的输出将包括 每个 执行的进程:由 make、由 make 运行的 shell 脚本等。

例如,您可能会发现 CMake 生成的 makefile 执行 /usr/bin/cmake -E __run_co_compile <lots of options ...> 并且仍然想知道它会运行的确切编译器调用是什么。你可以用 strace 方法得到它。


在 Windows 上与 strace 等效的是 Process Monitor
S
Scott McPeak

对于使用在内部调用 makecmake --build 的用户,请使用以下任一方法:

  $ cmake --build <dir> -- VERBOSE=1

注意 VERBOSE=1 之前的 --!这会将参数传递给底层的 make 进程。

或者:

  $ VERBOSE=1 cmake --build <dir>

它还将 VERBOSE=1 传递给 make,这次是通过环境变量。

或者,如果使用 cmake 版本 3.14 或更高版本:

  $ cmake --build <dir> --verbose

注意参数的顺序! --verbose 选项必须在 --build 及其参数之后。