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

10

Visual Studio使用很多宏来设置项目属性,这些宏列在此处。我无法找到这些宏或标识符在实际脚本文件中(而不是在项目设置中)的定义位置。

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

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

3个回答

10
在Visual Studio 2010中,主项目设置将定义一个输出文件夹,从该文件夹分配的宏是 $(OutDir)。还有其他预定义的宏,您无法修改,但这个宏可以。
如果我理解您要做什么,那么请按照以下步骤操作:
1.打开项目属性对话框。 2.对话框顶部有两个下拉列表,一个用于“配置”,一个用于“平台”。选择“所有”选项以配置列表。 3.在常规设置页面的顶部,有一个指定“输出目录”的文件夹。更改为以下内容(引号可选):"$(SolutionDir)$(Configuration)\"。结尾的反斜杠很重要。顺便说一下,这是$(OutDir)最终选择的设置。 4.在左树中打开“链接器”,然后选择“常规”设置。 5.在右窗格的顶部列表中,有一个“输出文件”选项。它应默认为 "$(OutDir)$(TargetName)$(TargetExt)"。如果不是,请设置为此设置。 6.重新构建项目。
注意:如果您有多个平台目标(win32和x64,例如),这就有点复杂了,但是也不会太糟糕。希望这可以帮助您。
编辑:OP还希望PDB和增量链接文件不要发布在同一文件夹中,但确实希望导入库发布在那里。
要更改创建PDB文件的位置,请执行以下操作:
1.打开项目文件,再次选择“所有”选项以更改所有构建配置目标(参见上文#2)。 2.在左树中选择链接器/调试设置。 3.从顶部开始的第二项应该是“生成程序数据库文件”设置。将其更改为 "$(IntDir)$(TargetName).pdb"。增量式链接文件必须(据我所知)与最终目标位于同一文件夹中。如果您想要禁用增量式链接,则可以在以下位置完成此操作:
  1. 打开项目文件,再次选择“全部”选项以更改所有构建配置目标(参见上面的#1)。
  2. 选择项目的链接器/常规设置。
  3. 第四个选项应该是“启用增量链接”。将其设置为
  4. 如果您禁用了增量式链接,则无法使用Visual Studio的“编辑和继续PDB调试格式”功能。但是,当您禁用增量式链接时,界面太笨拙,无法为您修复此问题。因此,请在项目窗格中选择C++ /常规。然后,如果它设置为“Edit/Continue的程序数据库”,请将其切换到Program Database /Zi

要将导入库生成的位置移动到其他地方,请按照以下步骤操作:

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

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


我按照你的步骤操作了(必须说一下第二步不是很清楚,但我理解这是配置更改)。我的项目是一个dll项目,它将.dll文件推送到解决方案调试文件夹中,但它也在那里创建了.ilk和.pdb文件,而它应该在常规调试文件夹中创建。此外,我还想将.lib文件推送到这个文件夹中,但它仍然会被创建在原始的调试文件夹中。 - zar
@zadane 我也可以更新那个答案。我更喜欢将PDB文件推送到构建输出文件夹的子文件夹“pdb”中(原始的,我知道=P)。推送导入库也不太困难。给我一分钟。 - WhozCraig
1
@zadane 对不起,我离开了一段时间。其他项目应该只需要使用新的库位置(前提是在每个消费项目的Project/Link/General设置配置页面中启用“链接库依赖项”),并且在项目依赖项中正确配置您的项目(即此DLL依赖于该DLL,此EXE依赖于这两个DLL等)。如果您正确设置了这些内容,则甚至不需要在消费者项目的“附加库”行中列出导入库。msbuild将免费为您连接它们。 - WhozCraig
如果是这种情况,那么您仍然在任何项目的“附加库链接配置”中拥有DLL的导入库(最可能是您的exe根据您的描述)。正如我所说的,如果您正确设置了项目的依赖关系并将“链接库依赖项”的链接设置设置为true,则无需将导入库添加到lib列表中。msbuild会在构建时自动将其放置在那里。请仔细检查并确保在链接设置中没有将其列入lib列表,并确保链接了依赖项并正确设置了Proj依赖关系。 - WhozCraig
1
@zadane 好的,这听起来有点奇怪,但是打开你的EXE项目设置。在“配置属性”上方有一个名为“公共属性”的节点,在那里应该只有一件事,“框架和引用”。将你的DLL项目添加为EXE项目的引用。然后应用、保存等操作。然后重新构建。注意:这应该是针对.NET的,不知道为什么C/C++项目需要这样做。我假设你的DLL项目已经正确地导出了它的内容,你似乎已经熟悉了devstudio,所以试试看吧。 - WhozCraig
显示剩余11条评论

3
大多数宏都是在包含在每个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 = bin \ DebugElsewhere之类来指定$(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>

0

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

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

我已经定义了自己的组 "My Values" 来保存这些值,但您可以在任何地方定义它们。我更喜欢尽可能高地在文件中定义它们,以便脚本的其余部分能够考虑到它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接