我正在开发一个在 Linux 上使用 CMake 构建的大型 C++ 项目。 CMake 运行良好,在模块和应用程序树中生成大量 Makefile。运行 GNU make
会导致链接器错误。我怎样才能让 make
在运行它们之前打印出确切的命令?
-d 选项不会打印命令,但会打印大量无用的信息。
-n 选项打印所有命令,但不运行它们,所以我不知道问题到底出在哪里。从 make -n 检查标准输出,我没有看到任何相关的命令。我怀疑某些命令会根据早期命令的结果而改变,并且 Makefile 的层次结构使得很难判断到底发生了什么。
我在 make 的手册页中没有看到任何其他看起来有用的选项。
我很确定这会奏效:
make VERBOSE=1
您还应该能够将其添加到您的 CMakeLists.txt 以永久设置:
set(CMAKE_VERBOSE_MAKEFILE on)
CMake FAQ 对此进行了介绍。
对于自动生成的 Makefile,请尝试:
make V=1
适用于 GNU make 并适用于任何 Makefile(无论是否由 CMake 生成)的选项是使用 --trace
选项进行制作。这将打印出 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 方法得到它。
strace
等效的是 Process Monitor。
对于使用在内部调用 make
的 cmake --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
及其参数之后。