在我的机器上,Visual C ++解决方案按此层次结构排列:
Projects
+-- expat2013
+-- expat2015
+-- zlib2013
+-- zlib2015
+-- MyApp
所有这些都是单独的解决方案。
使用Visual C ++ 2013构建时,MyApp
必须使用expat2013
和zlib2013
。这些目录在 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
,如果有必要,但我不知道我可以在哪里这样做,并且仍然让同事有机会将库放在他们想要的任何地方。
答案 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下的某个目录中。