Изменяет ли NuGets пути включения и связывания при добавлении в проект?
Конечно . Я могу сказать вам явно, что nuget импортирует дополнительные свойства в проект через файл <package_id>.targets
или <package_id>.props
, вместо того, чтобы вручную добавлять путь включения снова.
Это механизм упаковки Nuget для добавления дополнительных свойств проекта, таких как путь к библиотеке, непосредственно к проекту во время установки пакета Nuget. Более подробную информацию вы можете найти по этой ссылке .
<package_id>.targets
был создан в процессе упаковки пакета nuget. Другими словами, этот метод был разработан автором пакета nuget. И с моей стороны, файл openssl-vc141-static-x86_64.targets
существует по этому пути:
C:\Users\Admin\source\repos\ConsoleApplication25\packages\openssl-vc141-static-x86_64.1.1.0\build\native
Кроме того, Boost, кажется, добавил свои каталоги компоновщика в мой проект (хотя я вижу только это в выводе MSBuild, не в Свойствах конфигурации-> Linker-> Командная строка)
Я думаю, что проблема связана с разницей между <package_id>.targets
и <package_id>.props
. Хотя использование <package_id>.targets
не отображается в пользовательском интерфейсе свойства, оно по-прежнему работает для всего проекта.
Подробнее
При установке пакета nuget в Проект, эти файлы автоматически выполняются. Файл <target_id>.props
добавляется вверху файла, а файл .targets - внизу.
При инициализации файла xxx.vcxproj
, поскольку <package_id> .props
находится в начале файла, пользовательский интерфейс свойства может захватывать свойства в файле, а <package_id> .targets
в конце, поэтому инициализация не может быть захваченным, но все еще в проекте. Для nuget он использует openssl-vc141-static-x86_64.targets
.
В openssl-vc141-static-x86_64.targets
файле вы можете увидеть это:
<ClCompile>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)include\;%
(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>HAS_LIBTHRIFT;%(PreprocessorDefinitions)
</PreprocessorDefinitions>
</ClCompile>
И я установил выходной журнал на Diagnostic
и построил проект и нашел это:
Путь к библиотеке был добавлен в AdditionalIncludeDirectories
с помощью файла openssl-vc141-static-x86_64.targets
автоматически. Так что вам не нужно об этом беспокоиться.
Есть ли правильный способ добавить эти проекты, которые мне не хватает? Или правильный способ использовать файл целей? Или, может быть, OpenSSL stati c NuGet просто что-то упустил? Или, может быть, мне стоит взглянуть на vcpkg?
Вам не нужно беспокоиться об этом и не добавлять путь включения в свойство проекта. Это излишне, и когда вы закончите установку этого пакета nuget, используйте его непосредственно в cpp файлах.
Кроме того ,
Для пакетов c ++, установленных nuget, Вам не нужно добавлять пути к свойству проекта.
Обновление 1
Эта проблема связана с вашим проектом, а не с пакетом nuget. Именно потому, что в вашем текущем проекте нет $(Configuration)
, поэтому в openssl-vc141-static-x86_64.targets
вы можете увидеть это:
<ItemDefinitionGroup Label="Win32 and vc141 and Debug" Condition="'$(Platform)' == 'Win32' And ( $(PlatformToolset.IndexOf('v141')) > -1 Or '$(PlatformToolset)' == 'WindowsKernelModeDriver8.0' Or '$(PlatformToolset)' == 'WindowsApplicationForDrivers8.0' Or '$(PlatformToolset)' == 'WindowsUserModeDriver8.0' ) And '$(Configuration)' == 'Debug'">
<Link>
<AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)lib\Win32\static\Debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>libssl.lib;libcrypto.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>xcopy /Y "$(MSBuildThisFileDirectory)\lib\Win32\dynamic\*-1_1.dll" "$(OutDir)"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
Это операция для импорта указанных c libssl.lib
и libcrypto.Lib
в узел AdditionalDependencies
. Но вы можете узнать, что существует условие судьи And '$(Configuration)' == 'Debug'
, поскольку у вас нет $(Configuration)
, поэтому он всегда возвращает false , и эти библиотеки не могут быть автоматически импортированы в AdditionalDependencies
.
В качестве обходного пути , вы должны добавить эти пути lib вручную, как вы сказали.
И я уверен, что если вы используете проект, который содержит $(Configuration)
( Отладка или выпуск), вы не будете разрешать эту проблему. И большинство пакетов nuget C ++ можно использовать непосредственно в проекте, который содержит узел Configuration
.
Я уверен, что если вы используете $(Configuration)
в своем проекте, а затем переустановите этот пакет (пожалуйста, очистите кэш nuget , прежде чем делать это), вы не столкнетесь с этой ошибкой.
Кроме того, ваш снимок экрана, где вы это взяли? Я не вижу ничего подобного в консоли вывода VS или при запуске msbuild в командной строке. Есть ли способ, которым я мог случайно нарушить поведение по умолчанию?
Вы можете установить MSBuild project build output verbosity
на Diagnostic
с помощью Tools
-> Options
-> Projects and Solutions
- > Build and Run
.
Когда вы строите свой проект, Окно вывода показывает весь процесс сборки и записывает всю информацию, а затем вы можете искать ключевые поля с помощью поля поиска на Окно вывода .