如何设置每用户VC ++目录,但VC ++ 2013和VC ++ 2015有什么不同?

时间:2017-01-24 16:13:47

标签: visual-c++ msbuild

在我的机器上,Visual C ++解决方案按此层次结构排列:

Projects
+-- expat2013
+-- expat2015
+-- zlib2013
+-- zlib2015
+-- MyApp

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

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

Devel
+-- Libs
|   +-- expat2013
|   +-- expat2015
|   +-- zlib2013
|   +-- zlib2015
+-- MyApp

他们可以在 .user 属性表中拼出自己的目录。

输入Visual C ++ 2015。

将* 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 ++的版本引用不同库目录的推荐方法是什么?

问题是 Microsoft.Cpp.Win32.user Microsoft.Cpp.x64.user 属性表在Visual C ++ 2013和2015之间共享;我只能为每个库指定两个目录中的一个。

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

1 个答案:

答案 0 :(得分:1)

你真正应该做的不是区分VS版本,而是区分使用的工具集:VS2015可以用于使用相同的工具集来构建VS2013项目,所以即使你使用的是VS2015,你仍然需要目标,例如expat2013 ..但假设您只使用VS2013与v120和VS2015与v140工具集一起构建,您可以通过检查$(PlatformToolset)属性自动选择msbuild路径。

<PropertyGroup>
  <VsSuffix Condition="'$(PlatformToolset)'=='v120'>2013<VsSuffix >
  <VsSuffix Condition="'$(PlatformToolset)'=='v140'>2015<VsSuffix >
</PropertyGrop>

在默认生成的项目具有PropertyGroups设置PlatformToolset的位置之后,这将进入项目文件(或更好,一个公共属性表)。然后在声明包含目录等时使用

<ItemDefinitionGroup>
  <ClCompile>
    <AdditionalIncludeDirectories>expat$(VsSuffix);zlib$(VsSuffix);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
  </ClCompile>
</ItemDefinitionGroup>
  

问题是Microsoft.Cpp.Win32.user和Microsoft.Cpp.x64.user属性表在Visual C ++之间共享   2013年和2015年。

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

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

位于\ Microsoft.Cpp导入行的正下方。另请注意,这不一定是在UserRootDir中。我们经常做的是从$(ProjectDir)导入自定义道具文件(并使版本控制忽略它们),因此开发人员可以将所有工作保存在一个目录中,而不是分布在项目目录和AppData下的某个目录中。