Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VCTargetsPath is wrong when building with MSBuild on build server

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.

like image 515
l33t Avatar asked Nov 19 '13 16:11

l33t


People also ask

How do I change Vctargetspath?

We suggest you could install Registry Explorer extension, it could help you find related registries which are used to store macro values. In addition, you could also check related targets or props files in VS installation path: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise .

Do you need Visual Studio for MSBuild?

Visual Studio uses MSBuild, but MSBuild doesn't depend on Visual Studio. By invoking msbuild.exe on your project or solution file, you can orchestrate and build products in environments where Visual Studio isn't installed. Visual Studio uses MSBuild to load and build managed projects.

Where is Microsoft CPP default props?

Cpp. Default. props" exists in only in "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets".


1 Answers

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

like image 53
Palo Misik Avatar answered Oct 30 '22 16:10

Palo Misik