Добавить OpenSSL stati c lib в проект Visual Studio 2017 - PullRequest
0 голосов
/ 21 января 2020

Изменяют ли NuGets пути включения и связывания при добавлении в проект?

Мой опыт работы с CMake, где этот материал был тривиальным, но сейчас я работаю в компании, которая создает файлы решений с нуля. и я не уверен, как правильно добавить библиотеки stati c OpenSSL в мой проект. Я отправляю вопрос, чтобы убедиться, что я не дублирую что-либо или иным образом не путаюсь.

Когда я добавляю openssl-vc141-stati c -x86_64 в мой проект он создает файлы .lib и все остальное, но не изменяет пути включения или компоновщика.

Я могу вручную добавить пути компоновщика, но поскольку в проекте, который мне дали, нет типичного Release / Debug конфигурации, я не могу использовать макрос $(Configuration), чтобы указывать на целевые библиотеки - поэтому я просто указываю на Release. Хотя сборка работает.

Я вижу, что есть файл .targets, но он, похоже, ничего не делает.

( update )

Если быть точным c, я в основном строю Boost http_server_asyn c. cpp. Я получаю следующие ошибки компоновщика:

Error   LNK2019 unresolved external symbol _BIO_free referenced in function "public: __thiscall boost::asio::ssl::context::bio_cleanup::~bio_cleanup(void)" (??1bio_cleanup@context@ssl@asio@boost@@QAE@XZ) ESOIPDataScope  C:\gitrepo\ALIDB\ESOIPDataScope\DataHandler.obj 
Error   LNK2001 unresolved external symbol _BIO_free    ESOIPDataScope  C:\gitrepo\ALIDB\ESOIPDataScope\Listener.obj
... (48 more like this)

Когда я вручную добавляю $(SolutionDir)packages\openssl-vc141-static-x86_64.1.1.0\build\native\lib\Win32\static\Release\libcrypto.lib и $(SolutionDir)packages\openssl-vc141-static-x86_64.1.1.0\build\native\lib\Win32\static\Release\libssl.lib в качестве дополнительных зависимостей, проект компилируется.

(/ update )

Для контраста, я добавил NuGet со свободной графикой и заметил, что он предоставляет дополнительные параметры конфигурации (Свойства конфигурации → Ссылочные проекты), а Boost, кажется, добавил свои каталоги компоновщика в мой проект (хотя Я вижу только то, что в выходных данных MSBuild, а не в Configuration Properties-> Linker-> Command Line)

Есть ли правильный способ добавить эти проекты, которые мне не хватает? Или правильный способ использования файла targets? Или, может быть, OpenSSL stati c NuGet просто что-то упустил? Или, может быть, я должен просто посмотреть на vcpkg?

1 Ответ

1 голос
/ 21 января 2020

Изменяет ли 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 и построил проект и нашел это:

enter image description here

Путь к библиотеке был добавлен в 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')) &gt; -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.

Когда вы строите свой проект, Окно вывода показывает весь процесс сборки и записывает всю информацию, а затем вы можете искать ключевые поля с помощью поля поиска на Окно вывода .

...