Как избежать установки того же пакета 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, чтобы я мог просто ссылаться на другой проект и строить, не возясь с этими вещами каждый раз?

Вот ссылка на решение с проблемой, чтобы быстро воспроизвести ее:

VisualStudioNugetTestSolution.zip

0 ответов

Другие вопросы по тегам