Visual Studio中的脚本文件中定义的'$ OutDir'在哪里?

时间:2013-02-20 20:24:42

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

Visual Studio在列出here的项目设置中使用了大量宏。我无法找到实际脚本文件中定义的这些宏或标识符的位置(不在项目设置中)。

在我的情况下,我正在尝试将项目的输出文件夹更改为解决方案调试或发布文件夹(一级),但在项目设置中更改“输出目录”无效。

.vcxproj文件中没有提到这些宏,所以我真的不知道它们在哪里定义?我最感兴趣的是我想要更改为解决方案调试/发布文件夹的$(OutDir)。有谁知道这些定义在哪里?

3 个答案:

答案 0 :(得分:9)

在Visual Studio 2010中,主项目设置将定义输出文件夹,从此文件夹分配设置的宏为$(OutDir)。您还无法修改其他预定义的宏,但可以

如果我了解您要执行的操作,请按以下步骤操作:

  1. 打开项目的属性对话框。
  2. 在对话框的顶部有两个下拉列表,一个用于“配置”,另一个用于“平台”。选择配置列表的“全部”选项。
  3. 在常规设置页面顶部是指定“输出目录”的文件夹。将其更改为以下(引用可选)“$(SolutionDir)$(配置)\”。尾随反斜杠很重要。这是$(OutDir)最终选择的设置。
  4. 打开左侧树中的“链接器”项。然后选择“常规”设置。
  5. 在列表顶部的右窗格中是“输出文件”选项。它应默认为“$(OutDir)$(TargetName)$(TargetExt)”。如果不是,则将其设置为。
  6. 重建世界。
  7. 注意:如果您有多个平台目标(例如win32和x64),这会涉及更多,但不是那么糟糕。希望这会有所帮助。


    编辑 OP还希望PDB和增量链接文件在同一文件夹中发布,但 需要导入库在那里发表所以.....

    要更改创建PDB文件的位置:

    1. 打开项目文件,再次选择“全部”选项以更改所有构建配置目标(请参阅上面的#2)。
    2. 在左侧树中选择“链接器/调试”设置。
    3. 从顶部开始的第二项应该是“生成程序数据库文件”设置。将其更改为“$(IntDir)$(TargetName).pdb”

    4. 增量链接文件必须<(据我所知)与最终目标位于同一文件夹中。但是,如果需要,可以禁用增量链接。这是在以下位置完成的:

      1. 打开项目文件,再次选择“全部”选项以更改所有构建配置目标(请参阅上面的#1)。
      2. 选择项目的链接器/常规设置。
      3. 第四项应该是“启用增量链接”。将其设置为
      4. 如果您禁用增量链接,则无法使用编辑和放大器。继续使用Visual Studio的PDB调试格式功能,但是当您禁用增量链接时,UI太笨了,无法为您解决此问题。因此,请在项目窗格中选择C ++ / General。然后,如果设置为“编辑/继续编程数据库”,则将其切换为程序数据库/ Zi

      5. 移动构建导入库的位置。

        1. 打开项目文件,再次选择“全部”选项以更改所有构建配置目标(请参阅上面的#2)。
        2. 选择链接器/高级
        3. 在右侧窗格中将是一个关于中途的项目,导入库。将其更改为“$(OutDir)$(TargetName).lib”
        4. 不要问我如何摆脱导出列表文件(.exp)因为老实说我不知道​​。

答案 1 :(得分:3)

这些宏中的大多数都是在每个VS2010项目中包含的MSBuild目标文件中定义的。在项目文件的某个位置,可能在底部附近,您会找到如下所示的行:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

如果您追溯路径变量链,您最终会找到包含Microsoft.Cpp.targets的文件夹,该文件夹本身将包含:

    <Import Project="Microsoft.Common.targets" />

在此文件中,您将找到以下注释:

  

在使用此.TARGETS文件之前,必须在主项目文件中设置多个属性。      但是,如果未设置属性,我们会选择一些默认值。

     

OUTDIR:      指示项目或解决方案的最终输出位置。在构建解决方案时,

如果没有明确设置,MSBuild选择的默认值是默认$(OutDir)$(OutputPath)。项目文件中定义了$(OutputPath) ,因此在包含目标文件之前更改该属性将更改$(OutDir)的默认值。您也可以使用$(OutDir)或其他任何内容在msbuild命令行上指定/p:OutDir=bin\DebugElsewhere的值,这将覆盖MSBuild想要使用的任何默认值。 (例如,TFSBuild就是将解决方案中的所有内容转储到同一文件夹中。)

此外,为了将来可能的参考,大多数剩余的宏也在这个文件中定义,稍微向下:

<PropertyGroup>
  <TargetDir Condition="'$(OutDir)' != ''">$([MSBuild]::Escape($([System.IO.Path]::GetFullPath(`$([System.IO.Path]::Combine(`$(MSBuildProjectDirectory)`, `$(OutDir)`))`))))</TargetDir>
  <TargetPath Condition=" '$(TargetPath)' == '' ">$(TargetDir)$(TargetFileName)</TargetPath>
  <ProjectDir Condition=" '$(ProjectDir)' == '' ">$(MSBuildProjectDirectory)\</ProjectDir>
  <ProjectPath Condition=" '$(ProjectPath)' == '' ">$(ProjectDir)$(ProjectFileName)</ProjectPath>
      .
      .
      .
</PropertyGroup>

答案 2 :(得分:0)

让我分享自从提出这个问题以来我发现的内容。这些宏/属性是VS2010默认值,但您可以在.vcproj文件中通过在记事本中进行编辑来自行设置它们。注意:首先搜索.vcproj文件中的属性,如果它在那里,则将其值更改为所需的值,如果没有像下面那样定义它。我认为它通过在.vcproj文件中添加/编辑它们来覆盖这些定义。

  <PropertyGroup Label="My Values">
    <ProjectName>New_Project_Name</ProjectName>
  </PropertyGroup>

我已经定义了自己的小组&#34;我的价值观&#34;保留这些值,但您可以在任何地方定义它们。我更喜欢在文件中将它们定义为尽可能高,因此脚本的其余部分将它们考虑在内。