我正在使用 CMake 计算 C 项目的编译时间以进行编译统计。
您可以在下面看到我用于打印编译时间的 CMake cmd:
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
set_property(TARGET ${MAIN_TARGET} PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
这行代码在 Windows cmd 提示符下打印出来(例如):
Elapsed time: 0 s. (time), 0.000672 s. (clock)
所以计算对我来说是按预期进行的。但我希望将计算出的时间列在 .txt 文件中,而不是在 cmd 提示符下打印出来。
我在这里找到了解决方案: How to save CMake output to file?
cmake ... >> output_file.txt 2>&1
cmake ... 2>> output_file.txt
但我不明白如何将它用于我上面列出的 CMake cmd。我试过如下,但不幸的是它不起作用:
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time" >> output_file.txt 2>&1)
set_property(TARGET ${MAIN_TARGET} PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time" >> output_file.txt 2>&1)
我做错了什么?
由于 RULE_LAUNCH_COMPILE
指定了命令前缀,并且流重定向在 shell 命令的末尾进行,因此无法像这样使用它。
此外,CMake 中指定的命令不是 shell 命令。这意味着特殊字符将不会被解释,而只是作为命令的参数。
总而言之,您要尝试做的事情将扩展为如下内容:
cmake -E time >> output_file.txt 2>&1 gcc...
这不会由 shell 执行,而是由 CMake 本身执行,因此它将失败,因为时间将尝试执行名为“>>”的命令。
您的解决方案是使用中间脚本,例如:
@echo off
time %* >> output_file.txt
我们将此命名为 trace.cmd
。%*
的使用意味着我们将所有参数带到脚本并将它们作为参数传递给 time
命令。
然后你可以像这样使用它:
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E trace.cmd")
免责声明:我尚未测试该解决方案。
我是一名优秀的程序员,十分优秀!