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

时间:2014-01-03 07:06:37

标签: c++ visual-studio-2010 msbuild msbuild-4.0

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

如何在Visual Studio中执行相同的操作,以便它吐出用于编译程序的cl命令行?基本上我想要打F7(构建解决方案)并让整个事情自动化。我找不到它的宏。感谢

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

3 个答案:

答案 0 :(得分:1)

由于VS将底层构建系统切换到MsBuild,因此该对话框中显示的命令行仅在VS中以编程方式创建。它甚至可能不是传递给cl的 exact 命令行: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;
}

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

答案 1 :(得分:0)

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

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

  

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

详细将显示cl.exe命令行。

答案 2 :(得分:0)

我在msuild执行的cl命令行中遇到的最接近的东西是“黑客”调用cl.exe时使用的rsp文件。

使用Override compiler solution,我将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%

process.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脚本中都有每个命令的博客,但没有针对整个目标的博客。因此,它也在增量构建上构建了整个系统。