我正在开发一个在Linux上使用CMake构建的大型C ++项目。 CMake运行正常,在模块和应用程序树中生成大量的Makefile。运行GNU make
会导致链接器错误。如何在运行之前让make
打印出确切的命令?
-d选项不会打印命令,但会提供大量无用的信息。
-n选项打印所有命令,但不运行它们,所以我不知道确切的问题是什么。从make -n检查stdout,我没有看到任何相关的命令。我怀疑某些命令会根据早期命令的结果而改变,而Makefiles的层次结构使得很难分辨出真正发生的事情。
我在make的 man 页面中看不到其他任何看似有帮助的选项。
答案 0 :(得分:71)
我相信这会奏效:
make VERBOSE=1
您还应该能够将其添加到CMakeLists.txt中以永久设置:
set(CMAKE_VERBOSE_MAKEFILE on)
中介绍了这一点
答案 1 :(得分:8)
对于automake生成的Makefile,请尝试:
make V=1
答案 2 :(得分:2)
适用于GNU make并与任何Makefile一起使用的选项(无论是否由CMake生成)都可以使用--trace
选项进行make。这将打印出make
正在执行的命令,并仍然执行它们。
这适用于所有命令,而不仅仅是VERBOSE=1
或V=1
触发在CMake / automake生成的makefile中打印的命令。
Linux上的另一种替代方法是在strace下运行make,例如strace -f -e trace=execve make <make options>
。 strace的输出将包括执行的每个 进程:通过make,通过make ran编写的shell脚本等。
例如,您可能会发现CMake生成的makefile执行了/usr/bin/cmake -E __run_co_compile <lots of options ...>
,但仍然想知道将依次运行的确切编译器调用是什么。您可以使用strace方法获得它。
答案 3 :(得分:0)
对于使用cmake --build
(在内部调用make
的用户),请使用以下任一方法:
$ 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
及其参数之后。