我有一个项目,我从一个makefile转换而来,该文件有一个源文件,需要来自编译器的命令行选项。例如,如果您使用gcc构建项目,如果您执行了program --help
,则会吐出用于编译程序的gcc命令行。
如何在Visual Studio中执行相同的操作,以便它吐出用于编译程序的cl命令行?基本上我想要打F7(构建解决方案)并让整个事情自动化。我找不到它的宏。感谢
编辑;我的意思是编程,所以例如我想运行程序的输出,以包含使用的cl.exe命令字符串。您可以在Configuration Properties > C/C++ > Command Line > All Options
看到命令行,但我找不到它的宏或某种方法将其封装在文件中。
答案 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)
Visual Studio GUI使用MSBuild API。这样做会限制MSBuild输出。 如果您需要更多详细信息,请在Visual Studio中更改用户设置:
工具>选项>项目和解决方案>构建并运行>两个详细设置
详细将显示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脚本中都有每个命令的博客,但没有针对整个目标的博客。因此,它也在增量构建上构建了整个系统。