Как избежать установки того же пакета NuGet в проекте Visual Studio C++, который ссылается на другой проект, использующий пакет NuGet?
Допустим, у меня есть LibProject с WilUniqueHandleClass. В этом проекте также установлен пакет WIL NuGet, включая заголовок WIL.
#include <wil/resource.h>
в заголовке WilUniqueHandleClass и имеет общедоступное поле из этого заголовка:
LibProject прекрасно строится сам по себе.
Затем я добавляю этот проект в основной проект (тип .exe) в решении. Я добавляю ссылку на LibProject в VisualStudioNugetTestProject и включаю основной каталог LibProject в VisualStudioNugetTestProject с помощью
$(SolutionDir)LibProject
. Затем я включаю
#include "WilUniqueHandleClass.h"
заголовок в VisualStudioNugetTestProject.cpp. Затем я пытаюсь построить и получить эти ошибки:
Код серьезности Описание Ошибка состояния подавления строки файла проекта (активная) E1696 не удается открыть исходный файл "wil/resource.h" VisualStudioNugetTestProject D:\Projects\Tests\VisualStudioNugetTestSolution\LibProject\WilUniqueHandleClass.h 3
Ошибка C1083 Не удается открыть включаемый файл: 'wil/resource.h': Нет такого файла или каталога VisualStudioNugetTestProject D:\Projects\Tests\VisualStudioNugetTestSolution\LibProject\WilUniqueHandleClass.h 3
После того, как я установил пакет WIL Nuget в основной проект .exe, он отлично строится.
Включает в себя, что он должен работать в
$(SolutionDir)packages\Microsoft.Windows.ImplementationLibrary.1.0.201120.3\build\native\Microsoft.Windows.ImplementationLibrary.targets
файл, который выглядит так:
<?xml version="1.0"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)..\..\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
</Project>
Я могу включить этот каталог вручную в основной проект .exe:
$(SolutionDir)packages\Microsoft.Windows.ImplementationLibrary.1.0.201120.3\include
:
Но после того, как я обновлю пакет NuGet в проекте lib, это, очевидно, перестанет работать, потому что путь жестко запрограммирован.
Я чувствую, что оба способа исправить это: установка пакета NuGet в основной проект и включение каталога include вручную в основные проекты — это хакерские обходные пути, а не правильные решения.
Есть ли способ каким-то образом заставить основной проект включать все включения, необходимые для сборки из другого проекта lib, чтобы я мог просто ссылаться на другой проект и строить, не возясь с этими вещами каждый раз?
Вот ссылка на решение с проблемой, чтобы быстро воспроизвести ее: