首页 > 解决方案 > 如何使用 CMake 和 NMake 查看底层编译器/链接器命令行?

问题描述

因此,默认情况下使用响应文件来为某些工具链指定编译器和链接器的命令行开关。不过,这似乎只适用于 makefile。考虑到我使用生成器的场景,可以说这样做是为了绕过 Windows 上命令行的 8192 个字符长度限制NMake Makefiles

显然,这些设置应该受CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_OBJECTS据我所能找到的没有完全记录的控制。无论如何,CMake (3.15.1) 发行版附带的各种 CMake 脚本包含 0 或 1 用于这些设置(即每种语言<LANG>)。唯一似乎被阅读的地方是(cmMakefileTargetGenerator::CheckUseResponseFileForObjects()cmMakefileTargetGenerator.cxx撰写本文时)。

CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_INCLUDES互补设置以和的形式存在CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_LIBRARIES

现在,虽然这在技术上有效,但它确实给我带来了一个不受欢迎的副作用。在自动构建的日志中,我想看看发生了什么(是的,我也在设置CMAKE_VERBOSE_MAKEFILE=ON)。鉴于这些响应文件是即时生成的,我从日志文件中看到的命令行类似于:

C:\PROGRA~2\MICROS~1\2019\PROFES~1\VC\Tools\MSVC\1422~1.279\bin\Hostx86\x86\cl.exe @C:\Users\XA1DB~1.RLM\AppData\Local\Temp\nm2A99.tmp

这意味着我不再能看到正在传递的参数。对于我的目的,输出基本上变得无用。

如何让 CMake 生成生成文件,该文件还将向我显示内联响应文件的内容,以便我可以从构建日志中收集编译器/链接器命令行参数?

注意:不要误会我的意思,我完全理解 Windows 上的现有限制。但是,即使调用编译器或链接器的实际调用使用响应文件,我也只想查看响应文件内容而不是响应文件名。我正在寻找一种规范的方法来做到这一点,而不必想出一些在下次 CMake 对其内部进行更新时会破坏的 hacky 解决方案。


我还发现看到 2019 年使用的 8.3(替代)路径名称(给定fsutil behavior set disable8dot3 1/ NtfsDisable8dot3NameCreation)有点令人担忧,但也许 CMake 作者有我没有的见解。我无法在Git repo的最新源代码中找到任何设置来配置该行为。

标签: visual-c++cmakenmake

解决方案


nmake 有一个显示内联文件/响应文件的选项:

/U 转储内联文件

对于递归 make,您可能希望在这样的环境变量中设置它:

set MAKEFLAGS=U

这样,所有响应文件的内容都会出现在控制台上。


推荐阅读