簡體   English   中英

Visual Studio中的腳本文件中定義的'$ OutDir'在哪里?

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

Visual Studio在項目設置中使用了大量宏,這些宏列在此處 我無法找到實際腳本文件中定義的這些宏或標識符的位置(不在項目設置中)。

在我的情況下,我試圖將項目的輸出文件夾更改為解決方案調試或發布文件夾(一級),但在項目設置中更改“輸出目錄”無效。

在.vcxproj文件中沒有提到這些宏,所以我真的不知道他們在哪里定義? 我最感興趣的是我想要更改為解決方案調試/發布文件夾的$(OutDir) 有誰知道這些定義在哪里?

在Visual Studio 2010中,主項目設置將定義輸出文件夾,從此文件夾分配設置的宏是$(OutDir)。 還有其他預定義的宏無法修改,但您可以使用此宏。

如果我了解您要執行的操作,請按以下步驟操作:

  1. 打開項目的屬性對話框。
  2. 在對話框的頂部有兩個下拉列表,一個用於“配置”,一個用於“平台”。 選擇“配置”列表的“全部”選項。
  3. 在頂部的常規設置頁面上是指定“輸出目錄”的文件夾。 將其更改為以下(引用可選) “$(SolutionDir)$(配置)\\” 尾隨反斜杠很重要。 這是$(OutDir)最終選擇的設置。
  4. 打開左樹中的“鏈接器”項。 然后選擇“常規”設置。
  5. 在列表頂部的右窗格中是“輸出文件”選項。 它應默認為“$(OutDir)$(TargetName)$(TargetExt)” 如果不是,則將其設置為。
  6. 重建世界。

注意:如果您有多個平台目標(例如win32和x64),這會涉及更多,但不是那么糟糕。 希望這可以幫助。


編輯 OP也希望PDB和增量鏈接文件不能在同一文件夾中公布,但希望公布有導入庫。 所以.....

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

  1. 打開項目文件,再次選擇“全部”選項以更改所有構建配置目標(請參閱上面的#2)。
  2. 在左側樹中選擇“鏈接器/調試”設置。
  3. 頂部的第二項應該是“生成程序數據庫文件”設置。 將其更改為“$(IntDir)$(TargetName).pdb”

增量鏈接文件必須 (據我所知)與最終目標位於同一文件夾中。 但是,如果需要,可以禁用增量鏈接。 這是在以下位置完成的:

  1. 打開項目文件,再次選擇“全部”選項以更改所有構建配置目標(請參閱上面的#1)。
  2. 選擇項目的鏈接器/常規設置。
  3. 第四項應該是“啟用增量鏈接”。 將其設置為No。
  4. 如果您確實禁用了增量鏈接,則無法使用Visual Studio的編輯和繼續PDB調試格式功能,但是當您禁用增量鏈接時,UI太笨,無法為您解決此問題。因此,請在項目窗格中選擇C ++ / General 。 然后,如果設置為“編輯/繼續編程數據庫”,則將其切換到Program Database / 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) 您也可以使用/p:OutDir=bin\\DebugElsewhere或其他任何內容在msbuild命令行上為$(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>

我已經定義了自己的“我的值”組以保留這些值,但您可以在任何地方定義它們。 我更喜歡在文件中將它們定義為盡可能高,因此腳本的其余部分將它們考慮在內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM