Visual c++ 如何设置每个用户的VC++目录,但对于VC++2013和VC++2015不同? 在我的机器上,VisualC++解决方案被安排在这个层次: Projects +-- expat2013 +-- expat2015 +-- zlib2013 +-- zlib2015 +-- MyApp

Visual c++ 如何设置每个用户的VC++目录,但对于VC++2013和VC++2015不同? 在我的机器上,VisualC++解决方案被安排在这个层次: Projects +-- expat2013 +-- expat2015 +-- zlib2013 +-- zlib2015 +-- MyApp,visual-c++,msbuild,Visual C++,Msbuild,所有这些都是单独的解决方案 当我用Visual C++ 2013构建时,MyAPP必须使用EXTAT2013和ZLIB2013。这些目录在Microsoft.Cpp.Win32.user和Microsoft.Cpp.x64.user属性页的VC++目录中引用。这对我和同事都很有效,他们中的一些人更喜欢不同的目录布局: Devel +-- Libs | +-- expat2013 | +-- expat2015 | +-- zlib2013 | +-- zlib2015 +-- M

所有这些都是单独的解决方案

当我用Visual C++ 2013构建时,MyAPP必须使用EXTAT2013和ZLIB2013。这些目录在Microsoft.Cpp.Win32.user和Microsoft.Cpp.x64.user属性页的VC++目录中引用。这对我和同事都很有效,他们中的一些人更喜欢不同的目录布局:

Devel
+-- Libs
|   +-- expat2013
|   +-- expat2015
|   +-- zlib2013
|   +-- zlib2015
+-- MyApp
他们可以在.user属性表中拼写出自己的目录

进入Visual C++ 2015。< /P> 将*2013库链接到2015版MyApp失败,原因是

LINK : fatal error C1047: The object or library file 'D:\Projects\zlib2013\bin\zlib.lib' was created with an older compiler than other objects; rebuild old objects and libraries
这就是zlib和expat的独立构建存在于层次结构中的原因

根据Visual C++ +

版本推荐不同的图书馆目录推荐方法是什么? 问题是MySo.cpp.Wi32.Usand和McFas.CP.x64.UsEs属性表在Visual C++ 2013和2015之间共享;我只能为每个库指定两个目录中的一个


请注意,MyApp受版本控制。因此,我无法硬编码到任何地方的库的完整路径。如果有必要,我可以硬编码最后一个路径组件,例如expat2015,但我不知道我可以在哪里这样做,并且仍然可以给coworks一个机会,让他们可以将库放在任何地方。

您真正应该做的不是区分VS版本,但在使用的工具集之间:VS2015可用于使用相同的工具集构建VS2013项目,因此即使您使用VS2015,您仍必须以2013为目标。。但是,假设您仅使用VS2013使用v120生成,而使用VS2015使用v140工具集生成,则可以通过检查$PlatformToolset属性自动生成msbuild选择路径

<PropertyGroup>
  <VsSuffix Condition="'$(PlatformToolset)'=='v120'>2013<VsSuffix >
  <VsSuffix Condition="'$(PlatformToolset)'=='v140'>2015<VsSuffix >
</PropertyGrop>
这会进入项目文件,或者更好,在默认生成的项目具有设置PlatformToolset的PropertyGroups的位置之后的公共属性表。然后,在声明您使用的包含目录等时

<ItemDefinitionGroup>
  <ClCompile>
    <AdditionalIncludeDirectories>expat$(VsSuffix);zlib$(VsSuffix);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  </ClCompile>
</ItemDefinitionGroup>
问题是MySo.cpp.Wi32.Usand和McSoop.CPP.x64.Audio属性表在Visual C++之间共享。 2013年和2015年

这就是为什么可以说没有最适合你用它们做什么的原因。不确定您是否需要它,但是如果您希望devs具有每个项目和/或每个VS版本的自定义设置,您可以添加如下导入行

<Import Project="$(UserRootDir)\$(ProjectName)\$(VsSuffix)\dev.$(Platform).props" Condition="exists('"$(UserRootDir)\$(ProjectName)\$(VsSuffix)\dev.$(Platform).props"')"/>

就在\Microsoft.Cpp导入行下方。还要注意的是,这不必在UserRootDir中。我们经常做的是从$ProjectDir导入自定义道具文件,并使版本控制忽略它们,这样开发人员就可以将所有工作保存在一个目录中,而不是分散在project目录和AppData下的某个目录中。

为每个VS版本的完整库提供单独的目录似乎有些奇怪。我无法想象代码是如此的不同,以至于有必要复制它。仅仅拥有单独的项目文件通常就足够了。或者这些目录仅仅是由不同版本生成的库/二进制文件而不是源代码?@stijn库源代码实际上是相同的。目录zlib2013和zlib2015之间的唯一区别在于项目文件引用的工具集。expat*也一样。那么,仅仅拥有具有不同输出目录的独立项目文件可能更容易维护。或者甚至有一个公共项目文件,可以在需要时通过属性进行配置,并且在trun中,可以根据所需的工具集将其导入smaal“stub”项目文件中。名称VsSuffix是由组成的,而不是预定义的,对吗?是否可以在Microsoft.Cpp.Win32.user中定义目录的新类别?是的,VsSuffix是任意的。我不明白你最后一个问题是什么意思,什么是“目录类别”?Microsoft.Cpp.Win32.user只是msbuild开发人员选择的名称,并且在默认情况下会添加到每个项目文件中。您可以使用任意名称和任意属性表目录。我的意思是新的替代品等。例如,一些新的东西,如。但是我看到有UserMacros。这可能是我在上一个问题中提出的问题。是的,你可以将自定义属性放在UserMacros下,因为使用IDE更容易处理。到目前为止,我还没有找到可行的解决方案:-。因此,我采取了简单的方法,在expat和zlib库中禁用了整个程序优化。现在它们在工具集版本之间是可移植的,并且我不需要Visual C++ 2015的单独的构建目录。