visual vcvarsall studio compile compilar bat windows visual-studio msbuild arm

windows - vcvarsall - No se puede agregar la plataforma ARM al proyecto MSBuild existente



vcvarsall.bat visual studio 2017 (0)

Estoy tratando de agregar compatibilidad con la plataforma ARM a un proyecto existente de Visual C ++. Quiero asegurarme de que el proyecto pueda construir aplicaciones para Windows Phone y Windows Store además de los programas X86 y X64.

Microsoft no parece proporcionar documentación oficial sobre el tema (o parece que no puedo encontrarlo). En ausencia de documentación oficial, estoy siguiendo la discusión provista en Blogs de Microsoft en una guía para la estructura de archivos .vcxproj y .props . Creo que el blog es bastante bueno y no creo que tenga defectos, errores u omisiones.

lib.vcxproj es un MCVE y se muestra a continuación. Cuando construyo un objetivo X86 o X64 usando un archivo de proyecto Visual Studio C ++ desde un indicador de comando de desarrollador VS {2010 | 2012 | 2013} X86 o X64, entonces las cosas funcionan como se esperaba:

c:/Users/Test>msbuild /t:Build /p:Configuration=Debug;Platform=x64 lib.vcxproj Microsoft (R) Build Engine version 4.6.1055.0 [Microsoft .NET Framework, version 4.0.30319.42000] Copyright (C) Microsoft Corporation. All rights reserved. Build started 10/7/2016 3:03:15 PM. Project "c:/Users/Test/lib.vcxproj" on node 1 (Build target(s)). ... Done Building Project "c:/Users/Test/lib.vcxproj" (Build target(s)). Build succeeded. 0 Warning(s) 0 Error(s)

Cuando elimino el comentario del equipo específico de ARM:

<ProjectConfiguration Include="Debug|ARM"> <Configuration>Debug</Configuration> <Platform>ARM</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|ARM"> <Configuration>Release</Configuration> <Platform>ARM</Platform> </ProjectConfiguration>

A continuación, cambie a un símbolo del sistema de desarrollador de ARM e intente compilarlo; el resultado es una falla:

c:/Users/Test>msbuild /t:Build /p:Configuration=Debug;Platform=ARM lib.vcxproj Microsoft (R) Build Engine version 4.6.1055.0 [Microsoft .NET Framework, version 4.0.30319.42000] Copyright (C) Microsoft Corporation. All rights reserved. Build started 10/7/2016 7:43:12 PM. Project "c:/Users/Test/lib.vcxproj" on node 1 (Build target(s)). c:/Users/Test/lib.vcxproj : error MSB4057: The target "Build" does not exist in the project. Done Building Project "c:/Users/Test/lib.vcxproj" (Build target(s)) -- FAILED. Build FAILED. "c:/Users/Test/lib.vcxproj" (Build target) (1) -> c:/Users/Test/lib.vcxproj : error MSB4057: The target "Build" does not exist i n the project. 0 Warning(s) 1 Error(s)

Todas las herramientas ARM están instaladas correctamente. Regularmente construyo el proyecto desde la línea de comando con Nmake usando un símbolo del sistema de desarrollo ARM.

De acuerdo con los comentarios en Can MSBuild se puede usar para crear un proyecto de C ++ bajo ARM? , MSBuild no es compatible con ARM.

De acuerdo con Diferencia entre 2003 y los esquemas actuales de MSBuild , debería continuar usando la versión 2003 del esquema.

¿Cómo agrego el soporte de la plataforma ARM al proyecto existente de Visual C ++, basado en MSBuild?

Si recibe el mensaje de error "Compilar aplicaciones de escritorio para la plataforma ARM no es compatible" , agregue lo siguiente:

<ClCompile> <PreprocessorDefinitions>WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP;%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile>

Se puede agregar al ItemDefinitionGroup para ARM, cerca de la opción PrecomiledHeader .

lib.cpp

// One symbol static const int s_int = 1;

lib.vcxproj

<Project DefaultTargets="Build" ToolsVersion="4.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> <!-- BEGIN Added for ARM --> <!-- <ProjectConfiguration Include="Debug|ARM"> <Configuration>Debug</Configuration> <Platform>ARM</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|ARM"> <Configuration>Release</Configuration> <Platform>ARM</Platform> </ProjectConfiguration> --> <!-- END Added for ARM --> </ItemGroup> <PropertyGroup Label="Globals"> <ProjectGuid>{111111-1111-1111-1111-111111111111}</ProjectGuid> <RootNamespace>test</RootNamespace> <PlatformToolset>v100</PlatformToolset> <ConfigurationType>StaticLibrary</ConfigurationType> </PropertyGroup> <Import Project="$(VCTargetsPath)/Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)/Microsoft.Cpp.props" /> <ImportGroup Label="ExtensionSettings" /> <ImportGroup Label="PropertySheets"> <Import Project="$(UserRootDir)/Microsoft.Cpp.$(Platform).user.props" Condition="exists(''$(UserRootDir)/Microsoft.Cpp.$(Platform).user.props'')" Label="LocalAppDataPlatform" /> </ImportGroup> <PropertyGroup Label="UserMacros" /> <!-- X86 Configurations --> <ItemDefinitionGroup Condition="''$(Platform)''==''Win32''" Label="X86 Configuration"> <ClCompile> <PrecompiledHeader /> </ClCompile> <Lib> <TargetMachine>MachineX86</TargetMachine> <ImageHasSafeExceptionHandlers>true</ImageHasSafeExceptionHandlers> </Lib> </ItemDefinitionGroup> <!-- X64 Configurations --> <ItemDefinitionGroup Condition="''$(Platform)''==''x64''" Label="X64 Configuration"> <ClCompile> <PrecompiledHeader /> </ClCompile> <Lib> <TargetMachine>MachineX64</TargetMachine> </Lib> </ItemDefinitionGroup> <!-- ARM Configurations --> <ItemDefinitionGroup Condition="''$(Platform)''==''ARM''" Label="ARM Configuration"> <ClCompile> <PrecompiledHeader /> </ClCompile> <Lib> <TargetMachine>MachineARM</TargetMachine> </Lib> </ItemDefinitionGroup> <ItemGroup> <ClCompile Include="lib.cpp" /> </ItemGroup> <Import Project="$(VCTargetsPath)/Microsoft.Cpp.targets" /> </Project>

No, esto no es un duplicado. Vea el comentario que explica por qué .