9
votes

In my C++ project, Test.wcxproj, I have the following configurations defined:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>

Then I have the problematic import of the default C++ properties:

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

When my build server builds my MSBuild project file (configuration is Release and platform is Any CPU), I get this error:

error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Default.props" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

The relevant parts of my MSBuild project file look like this:

<ItemGroup>
   <ProjectFiles Include="$(MSBuildProjectDirectory)\**\*.csproj" />
   <ProjectFiles Include="$(MSBuildProjectDirectory)\**\*.vcxproj" />
</ItemGroup>
<PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>x64</Platform>
    <OutputFolder>$(MSBuildProjectDirectory)\BuildOutput\$(Configuration)</OutputFolder>
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)</SolutionDir>
</PropertyGroup>
...
<Target Name="Compile">
    <MSBuild Projects="@(ProjectFiles)" Targets="Build" Properties="Configuration=$(Configuration);Platform=$(Platform);OutputPath=$(OutputFolder)\$(MSBuildProjectName);SolutionDir=$(SolutionDir)\" />
</Target>

The problem

In my MSBuild project file, I am using ToolsVersion="12.0". Visual Studio 2013 is indeed installed, so I don't understand why it chooses to use v4.0\v110. Are my project configurations for some reason skipped by MSBuild? I guess I could somehow override this folder using the /p switch, but I want my .proj file to be self-contained.

2
Can you please provide us property PlatformToolset of that project? It looks like you build vc2012 project on build machine where vc2012 wasn’t installed or you explicitly pass PlatformToolset property from command line. v110 is vc2012 platform toolset. v120 is vc2013 default platform toolset.Palo Misik
We upgraded a vc2010 project using VS2013. Now it says "v120" everywhere in the project file. We don't specify a PlatformToolset from command line. I'm starting to suspect that the build machine has some VC11 beta fragments left.l33t
Hey, I have the same issue. Ever solve it? :)Tim Lovell-Smith

2 Answers

9
votes

Try to set up environment variable

VisualStudioVersion=12.0

or pass it explicitly as property to msbuild on commandline

msbuild.exe <project or solution to build> /p:VisualStudioVersion=12.0

I think it is because Microsoft tries to keep compatibility with older Visual Studios.

see Visual Studio project compatibility and VisualStudioVersion

3
votes

In my case, my build definition was configured to build my .sln file instead of my .proj file. I remember configuring it to build the MSBuild project, but somehow it seems to have reverted to the Solution.

Anyway, I found two solutions to the problem:

  1. Make sure to build the .proj file (where the tools version is indeed set to 12.0).
  2. Explicitly set the VCTargetsPath.