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

Where is '$OutDir' defined in the script file in Visual Studio?

本文关键字:文件 在哪里 脚本 定义 Studio OutDir Visual      更新时间:2023-10-16

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

在我的情况下,我试图将项目的输出文件夹更改为解决方案调试或发布文件夹的输出文件夹(一级以上),但在项目设置中更改"输出目录"没有效果。

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

在Visual Studio 2010中,主项目设置将定义一个输出文件夹,从该文件夹分配中设置的宏为$(OutDir)。还有其他预定义的宏不能修改,但是可以修改。

如果我理解你想做什么,那么按照以下步骤操作:

  1. 打开项目的属性对话框
  2. 对话框顶部有两个下拉列表,一个用于"配置",一个为"平台"。在配置列表中选择"全部"选项
  3. 在"常规设置"页面的顶部是一个指定为"输出目录"的文件夹。将其更改为以下内容(引号可选)"$(SolutionDir)$(Configuration)\"。尾部反斜杠很重要。这是$(OutDir)最终选择的设置
  4. 打开左侧树中的"链接器"项目。然后选择"常规"设置
  5. 在列表顶部的右侧窗格中是"输出文件"选项。它应该默认为"$(OutDir)$(TargetName)$(TargetExt)"。如果不是,则将其设置为这样
  6. 重建世界

注意:如果你有多个平台目标(例如win32和x64),这会涉及更多,但也没那么糟糕。希望这能有所帮助。


EDITOP也希望PDB和增量链接文件不发布在同一文件夹中,但确实希望导入库发布在那里。所以……

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

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

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

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

移动到构建导入库的位置。

  1. 打开项目文件,再次选择"全部"选项以更改所有构建配置目标(请参见上面的#2)
  2. 选择链接器/高级
  3. 在右侧窗格中,将有一个位于中间位置的项目"导入库"。将其更改为"$(OutDir)$(TargetName).lib"

不要问我如何删除导出列表文件(.exp),因为我真的不知道。

这些宏中的大多数都是在每个VS2010项目中包含的MSBuild目标文件中定义的。在你的项目文件的某个地方,可能在底部附近,你会发现这样一行:

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

如果你沿着路径变量链返回,你最终会找到包含Microsoft.Cpp.targets的文件夹,它本身将包含:

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

在这个文件中,你会发现以下注释:

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

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

MSBuild选择的默认值是默认$(OutDir)$(OutputPath)(如果未显式设置)。$(OutputPath)是在项目文件中定义的,因此在包含目标文件之前更改该属性将更改$(OutDir)的默认值。您也可以在msbuild命令行上使用/p:OutDir=binDebugElsewhere或其他方法为$(OutDir)指定一个值,该值将覆盖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>

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

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

我定义了自己的小组"我的价值观"来保持这些价值观,但你可以在任何地方定义它们。我更喜欢在文件中尽可能高地定义它们,这样脚本的其余部分就会考虑到它们。