Dar*_*enW 60 linux cmake gnu-make
我正在开发一个用Linux上的CMake构建的大型C++项目.CMake运行正常,在模块和应用程序树中生成大量的Makefile.运行GNU make会导致链接器错误.如何make在运行之前打印出确切的命令?
-d选项不会打印命令,但是大量信息没有帮助.
-n选项打印所有命令,但不运行它们,所以我不知道确切的问题是什么.从make -n检查stdout,我没有看到任何相关的命令.我怀疑某些命令会根据早期命令的结果而改变,而Makefiles的层次结构使得很难分辨出真正发生的事情.
我在make的手册页中看不到其他任何看起来有用的选项.
Bil*_*nch 73
我相信这会奏效:
make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)
您还应该能够将其添加到CMakeLists.txt中以永久设置:
set(CMAKE_VERBOSE_MAKEFILE on)
Run Code Online (Sandbox Code Playgroud)
这在CMake FAQ中有所介绍.
Sco*_*eak 10
对于那些使用内部cmake --build调用的make,请使用:
$ cmake --build <dir> -- VERBOSE=1
Run Code Online (Sandbox Code Playgroud)
注意--前面的VERBOSE=1!这会将参数传递给底层make进程。
或者:
$ VERBOSE=1 cmake --build <dir>
Run Code Online (Sandbox Code Playgroud)
这次也通过环境变量传递VERBOSE=1给。make
或者,如果使用cmake 版本 3.14或更高版本:
$ cmake --build <dir> --verbose
Run Code Online (Sandbox Code Playgroud)
注意参数的顺序!该--verbose选项必须位于--build其参数之后。
对于automake生成的Makefile,请尝试:
make V=1
Run Code Online (Sandbox Code Playgroud)
适用于 GNU make 并可与任何 Makefile(无论是否由 CMake 生成)一起使用的选项是使用--tracemake 选项。这将打印出正在执行的命令make并仍然执行它们。
VERBOSE=1这适用于所有命令,而不仅仅是那些V=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 方法得到它。