10

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

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

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

4

3 回答 3

10

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

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

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

注意:如果您有多个平台目标(例如 win32 和 x64),这会涉及更多,但还不错。希望这可以帮助。


EDIT OP 还希望 PDB 和增量链接文件不要发布在同一个文件夹中,但希望导入库在那里发布。所以.....

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

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

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

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

移动构建导入库的位置。

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

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

于 2013-02-20T20:52:28.440 回答
3

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

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

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

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

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

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

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

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

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

<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>
于 2013-02-20T21:13:40.467 回答
0

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

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

我已经定义了我自己的组“我的价值观”来保留这些价值观,但你可以在任何地方定义它们。我更喜欢在文件中尽可能高地定义它们,以便脚本的其余部分将它们考虑在内。

于 2014-03-31T14:56:49.673 回答