У меня проблема при попытке перенести проект C ++ / C ++ CLI на платформу VSTS
Я создал STATIC C ++ библиотеку «Diota.Tools.Utilities.Cpp» и упаковал / выдвинул ее как Nuget на VSTS. Мой пакет содержит .targets, который позволяет устанавливать AdditionalIncludeDirectories, AdditionalDependencies и AdditionalLibraryDirectory в vcxproj любого «принимающего» проекта, ссылающегося на мой пакет Nuget. Смотрите мой файл .targets, встроенный в мой пакет Nuget ниже.
Я проверил свои .targets, и он работает в том смысле, что устанавливает AdditionalIncludeDirectories, AdditionalDependencies и AdditionalLibraryDirectory в принимающем проекте, даже если он не виден в пользовательском интерфейсе Visual Studio.
.целевой файл моего пакета Nuget
Моя проблема заключается в следующем: если в «принимающем» проекте с именем Diota.Tools.Mesh.Cpp у меня также есть «локальные» настройки для AdditionalIncludeDirectores, AdditionalDependencies и AdditionalLibraryDirectory, эти локальные настройки, кажется, игнорируются после ссылки и установки моего Пакет Nuget Diota.Tools.Utilities.Cpp для этого принимающего проекта.
Поскольку Visual Studio не позволяет визуализировать параметры AdditionalIncludeDirectores, AdditionalDependencies и AdditionalLibraryDirectory, полученные при загрузке моего пакета Nuget, я не могу на самом деле отлаживать. Я думал, что использование% (AdditionalIncludeDirectories)% (AdditionalDependencies)% (AdditionalLibraryDirectories) позволило объединить путь поиска из .targets и локальных настроек, но, похоже, он не работает.
В конце этого сообщения находится файл проекта vcxproj принимающего проекта Diota.Tools.Mesh.cpp, поскольку я сохранил его для сборки VSTS.
Одна интересная вещь заключается в том, что связывание и загрузка пакета Diota.Tools.Utilities.Cpp в Diota.Tools.Mesh.Cpp работает локально на моей машине. Проблема возникает только при сборке VSTS, при попытке скомпилировать «Diota.Tools.Mesh.CLIWrapper» очевидно, что все ссылки на статическую библиотеку Diota.Tools.Utilities.Cpp не работают, даже если загрузка Nuget работала.
Результаты при сборке Diota.Tools.Mesh на VSTS с автоматическим восстановлением пакетов Diota.Tools.Utilities:
Строится на VSTS
Ошибка сборки на VSTS
Я могу предоставить весь код, необходимый для отладки.
Просто чтобы быть очень точным: каждый проект содержит 2 подпроекта:
Diota.Tools.Utilities содержит:
— Diota.Tools.Utilities.Cpp (чистый C ++)
— Diota.Tools.Utilities.CLIWrapper (CLI / C ++, C # упаковка)
==> Для каждого из двух проектов создаются два пакета Nugets
Diota.Tools.Mesh содержит:
— Diota.Tools.Mesh.Cpp (чистый C ++) ==> вызывает связанный с Diota.Tools.Utilities.Cpp пакет Nuget
— Diota.Tools.Mesh.CLIWrapper (CLI / C ++, C # wrapping) ==> вызывает оба пакета Diota.Tools.Utilities Nuget, но описанная выше ошибка связана с неправильной установкой пакета Diota.Tools.Utilities.Cpp.
Заранее спасибо за вашу помощь в этом 🙂
Получение файла проекта vcxproj:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{52E80ADA-5497-4122-9257-A0E9910BC01B}</ProjectGuid>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<Keyword>ManagedCProj</Keyword>
<RootNamespace>DiotaToolsMeshCLIWrapper</RootNamespace>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CLRSupport>true</CLRSupport>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IntDir>$(Platform)\$(PlatformToolset)\$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)\$(ProjectName).Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<IntDir>$(Platform)\$(PlatformToolset)\$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)\$(ProjectName).Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<IntDir>$(Platform)\$(PlatformToolset)\$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)\$(ProjectName).Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<IntDir>$(Platform)\$(PlatformToolset)\$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)\$(ProjectName).Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>$(SolutionDir)\Diota.Tools.Mesh.Cpp.Nuget\build\native\include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>Diota.Tools.Mesh.Cpp.lib;</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)\Diota.Tools.Mesh.Cpp.Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\;</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>$(SolutionDir)\Diota.Tools.Mesh.Cpp.Nuget\build\native\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>Diota.Tools.Mesh.Cpp.lib;</AdditionalDependencies>
<AdditionalLibraryDirectories>$(MSBuildProjectDirectory)\..\Diota.Tools.Mesh.Cpp.Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<ProjectReference>
<UseLibraryDependencyInputs>true</UseLibraryDependencyInputs>
</ProjectReference>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>$(SolutionDir)\Diota.Tools.Mesh.Cpp.Nuget\build\native\include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalDependencies>Diota.Tools.Mesh.Cpp.lib;</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)\Diota.Tools.Mesh.Cpp.Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\;</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<AdditionalIncludeDirectories>$(SolutionDir)\Diota.Tools.Mesh.Cpp.Nuget\build\native\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
</ClCompile>
<Link>
<AdditionalDependencies>Diota.Tools.Mesh.Cpp.lib;</AdditionalDependencies>
<AdditionalLibraryDirectories>$(MSBuildProjectDirectory)\..\Diota.Tools.Mesh.Cpp.Nuget\build\native\lib\$(Platform)\$(PlatformToolset)\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<LinkStatus>true</LinkStatus>
</Link>
<ProjectReference>
<UseLibraryDependencyInputs>true</UseLibraryDependencyInputs>
</ProjectReference>
</ItemDefinitionGroup>
<ItemGroup>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Diota.Tools.Mesh.CLIWrapper.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="Stdafx.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="AssemblyInfo.cpp" />
<ClCompile Include="Diota.Tools.Mesh.CLIWrapper.cpp" />
<ClCompile Include="Stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="app.rc" />
</ItemGroup>
<ItemGroup>
<Image Include="app.ico" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="..\packages\assimp_native.redist.4.0.1\build\native\assimp_native.redist.targets" Condition="Exists('..\packages\assimp_native.redist.4.0.1\build\native\assimp_native.redist.targets')" />
<Import Project="..\packages\assimp_native.4.0.1\build\native\assimp_native.targets" Condition="Exists('..\packages\assimp_native.4.0.1\build\native\assimp_native.targets')" />
<Import Project="..\packages\Diota.Tools.Utilities.CLIWrapper.0.0.48\build\Diota.Tools.Utilities.CLIWrapper.targets" Condition="Exists('..\packages\Diota.Tools.Utilities.CLIWrapper.0.0.48\build\Diota.Tools.Utilities.CLIWrapper.targets')" />
<Import Project="..\packages\Diota.Tools.Utilities.Cpp.0.0.48\build\Diota.Tools.Utilities.Cpp.targets" Condition="Exists('..\packages\Diota.Tools.Utilities.Cpp.0.0.48\build\Diota.Tools.Utilities.Cpp.targets')" />
</ImportGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Ce projet fait référence à des packages NuGet qui sont manquants sur cet ordinateur. Utilisez l'option de restauration des packages NuGet pour les télécharger. Pour plus d'informations, consultez http://go.microsoft.com/fwlink/?LinkID=322105. Le fichier manquant est : {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\assimp_native.redist.4.0.1\build\native\assimp_native.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\assimp_native.redist.4.0.1\build\native\assimp_native.redist.targets'))" />
<Error Condition="!Exists('..\packages\assimp_native.4.0.1\build\native\assimp_native.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\assimp_native.4.0.1\build\native\assimp_native.targets'))" />
<Error Condition="!Exists('..\packages\Diota.Tools.Utilities.CLIWrapper.0.0.48\build\Diota.Tools.Utilities.CLIWrapper.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Diota.Tools.Utilities.CLIWrapper.0.0.48\build\Diota.Tools.Utilities.CLIWrapper.targets'))" />
<Error Condition="!Exists('..\packages\Diota.Tools.Utilities.Cpp.0.0.48\build\Diota.Tools.Utilities.Cpp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Diota.Tools.Utilities.Cpp.0.0.48\build\Diota.Tools.Utilities.Cpp.targets'))" />
</Target>
</Project>
Задача ещё не решена.
Других решений пока нет …