如何在Visual Studio 2010中捕获cl.exe命令行



我有一个从makefile转换而来的项目,该makefile的源文件需要编译器提供命令行选项。例如,当使用gcc构建项目时,如果执行program --help,它将吐出用于编译程序的gcc命令行。

我怎么能在Visual Studio中做同样的事情,让它吐出用于编译程序的cl命令行?基本上,我想点击F7(构建解决方案),并使整个过程自动化。我找不到它的宏。谢谢

编辑;我的意思是程序化的,所以例如,当我运行程序时,我希望它的输出包含所使用的cl.exe命令字符串。您可以在Configuration Properties > C/C++ > Command Line > All Options中看到命令行,但我找不到它的宏,也找不到将它封装在文件中的方法。

.vcxproj是MSBuild项目格式的Visual Studio项目。您可以使用Visual Studio GUI或msbuild API运行msbuild.exe、devenv.exe和devenv.com来构建它。

Visual Studio GUI使用MSBuild API。这样做会限制MSBuild的输出。如果需要更多详细信息,请在Visual Studio中更改用户设置:

工具>选项>项目和解决方案>构建和运行>两个详细设置

Detailed将显示cl.exe命令行。

由于VS将底层构建系统切换为MsBuild,因此该对话框中显示的命令行仅在VS中以编程方式创建。它甚至可能不是传递给cl的确切的命令行:MsBuild本身通过任务调用cl,因此与VS中显示的内容没有直接联系,也没有方法从中获取命令行。

无论如何,不存在命令行这样的东西,因为每个源文件可能有不同的选项。此外,我怀疑你是否想要完整的命令行,包括绝对包含路径等。没有人对此感兴趣。现在,如果您巧妙地利用http://msdn.microsoft.com/en-us/library/b0084kay.aspx你可以自己重新创建命令行,因为大多数选项都在那里:

std::string CompilerCommandLineOptions()
{
std::string cmd;
#ifdef _CHAR_UNSIGNED
cmd += " /J";
#endif
#ifdef __cplusplus_cli
cmd += " /clr";
#endif
#ifdef _CPPRTTI
cmd += " /GR"
#endif
//etc
return cmd;
}

注意:你确定这件事值得吗?真的有人对命令行感兴趣吗?这甚至不足以建造这个项目。为什么不选择链接器选项呢?

我遇到的msuild执行的cl命令行中最接近的是"黑客攻击";调用cl.exe.时使用的rsp文件

使用Override编译器解决方案,我将ClCompile ToolExe更改为自定义mycl.bat脚本,该脚本收到一个参数,该参数为@tmp-1234xxx.rsp文件。这个rsp文件包含除了cl.exe路径之外的整个命令行,类似于-

rsp文件

/p/DDEBUG Source.cpp

然后,通过调用一个单独的bash脚本对rsp文件进行所需的更改(这对我来说非常小)后,我用我的rsp文件的内容调用了cl.exe。所以,每当用户点击构建按钮时,这个脚本就会执行。

mycl.bat脚本

@echo off
SET PATH=%PATH%;/usr/bin  //to call cygwin bash
set parameter=%1
set parameter=%parameter:~1% //to remove @ in the beginning 
c:/cygwin/bin/bash process.sh %parameter%

处理.sh

iconv -f UCS-2 -t UTF-8 <$1 >$1.conv  //file converted to UTF-8, else bash wasn't handling it well
contents=`cat $1.conv`
#Processing on file contents here
path/to/cl.exe $(contents)

非常糟糕的解决方案,但它适用于我的用例。我想根据一些逻辑随时更改文件的名称。

我面临的问题是,Visual Studio使用CL Task编写的tlog来检查文件是否需要在增量构建中重建,而我的目标的tlog文件不够。批处理和bash脚本中的每个命令都有tlog,但不是针对整个目标的。所以,它也是在增量构建的基础上构建整个东西。

最新更新