Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 默认用户特定属性_C++_Visual Studio_Visual Studio 2015_Msbuild - Fatal编程技术网

C++ 默认用户特定属性

C++ 默认用户特定属性,c++,visual-studio,visual-studio-2015,msbuild,C++,Visual Studio,Visual Studio 2015,Msbuild,我正在处理一个需要设置名为$(LibPath)的属性的项目。该值应由插件设置,但它保存在projectname.vcxproj.user文件中。如果有人删除了此文件(例如通过git clean),或者有人重新开始项目,则会出现此问题 为了有一个默认值,我创建了一个属性表,它位于项目文件的最顶端 <PropertyGroup Label="UserMacros"> <LibPath Condition="'$(LibPath)' == ''">PathToLib<

我正在处理一个需要设置名为
$(LibPath)
的属性的项目。该值应由插件设置,但它保存在
projectname.vcxproj.user
文件中。如果有人删除了此文件(例如通过
git clean
),或者有人重新开始项目,则会出现此问题

为了有一个默认值,我创建了一个属性表,它位于项目文件的最顶端

<PropertyGroup Label="UserMacros">
  <LibPath Condition="'$(LibPath)' == ''">PathToLib</LibPath>
</PropertyGroup>
<ItemGroup>
  <BuildMacro Include="LibPath">
    <Value>$(LibPath)</Value>
  </BuildMacro>
</ItemGroup>

PathToLib
$(LibPath)
它现在适用于路径与默认路径匹配的所有人。如果没有,他们可以在VS中通过属性管理器->属性表文件->用户宏进行更改

现在剩下的问题是,当此路径不匹配并且需要更改时,属性表中的值也会更改

那么我的问题是:是否有一种方法可以定义一个属性,该属性可以从VS中编辑,然后保存在
vcxproj.user
文件(或覆盖默认值的任何其他用户特定文件)中

是否有一种方法可以定义可以从保存在vcxproj.user文件中的VS中编辑的属性

好的,当路径不匹配时,您无法在Visual Studio中编辑定义的属性的原因恐怕是vcxproj.user文件是在属性表之后导入的

如果我们创建属性表,我们将在项目文件中获得以下导入文件
TestSheet.props

  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
    <Import Project="TestSheet.props" />
  </ImportGroup>
此文件位于项目文件中的
TestSheet.props
下:

  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
    <Import Project="TestSheet.props" />
  </ImportGroup>

在这种情况下,MSBuild将使用vcxproj.user文件中的
$(LibPath)
值替换属性表中的值。因此,它只适用于路径与默认路径匹配的所有人,如果您通过转到“属性管理器”->“属性表文件”->“用户宏”更改该值,该值将被下一个导入文件
Microsoft.Cpp.targets
覆盖

要解决此问题,您可以注释项目文件中的所有
行,并在导入
Microsoft.Cpp.targets
文件后添加此行:

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


使用此设置,如果更改用户宏中的值,此值将覆盖
vcxproj.User
文件中的值

谢谢你的回答。可能我不太清楚,因为我希望
.user
文件覆盖默认值。属性表的作用应类似于默认值。当用户更改它时,我希望新值作为属性显示在
.user
文件中,然后该文件将覆盖默认值。@Broxzier,明白了。如果要覆盖.user文件中的该值,可以创建自定义任务来替换该值:。或者使用PowerShell替换该值。