Я использую 3 библиотеки, подключил их все с помощью vcpkg, используя static, скомпилировал в Release/MT, но не понимаю, почему 2 из них создаются динамически:
libcrypto-3-x64.dll и ssh.dll
С помощью DependencyWalker я увидел, что сам файл .exe напрямую требует только ssh.dll, а ssh.dll требует libcrypto-3-x64.dll.
С jsoncpp.lib проблем нет.
Я добавил их в проект соответственно:
"C:\Program Files\Microsoft Visual Studio\2022\vcpkg\packages\openssl_x64-windows-static\lib;C:\Program Files\Microsoft Visual Studio\2022\vcpkg\packages\libssh_x64-windows-static\lib;C:\Program Files\Microsoft Visual Studio\2022\vcpkg\packages\jsoncpp_x64-windows-static\lib"
Я также добавил соответствующие библиотеки в список дополнительных зависимостей:
"$(CoreLibraryDependencies);%(AdditionalDependencies)Crypt32.lib;ws2_32.lib;ssh.lib;jsoncpp.lib;libcrypto.lib"
Но дело в том, что libcrypto.lib нужны другие библиотеки Windows, которые я тоже включаю (без указания пути к ним):
Crypt32.lib;ws2_32.lib
Также я использую аналогичные настройки включения и прагмы:
#include <Windows.h>
#include <wincrypt.h>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <openssl/evp.h>
#include <libssh/sftp.h>
#include <fcntl.h>
#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "jsoncpp.lib")
#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "ssh.lib")
Может быть дело в подключении .h заголовочных файлов (openssl/evp.h, libssh/sftp.h, fcntl.h) из libssh и openssl?
Я понимаю, что проблема скорее всего в Crypt32.lib и
ws2_32.lib, но я новичок и не понимаю как это исправить. Я не смог найти в Интернете способа статически соединить эти две библиотеки. Конечно, я мог бы потратить время сам и найти решение, но я уже потратил весь день на понимание статической компиляции и поэтому прошу вашей помощи.
Что я могу добавить? Проблема только с ssh.lib, с libcrypto.lib проблем нет (проверено). Скорее всего ssh.lib нельзя сделать статичным, что очень печально. Но если у кого-нибудь есть идеи, буду рад.
Я соединил их все с помощью vcpkg, используя static. Вы уверены, что использовали статические триплеты, например: https://github.com/microsoft/vcpkg/blob/master/triplets/x64-windows-static.cmake ? Если вы не получаете статические библиотеки с одним из статических триплетов, возможно, это ошибка этого порта или, возможно, он не поддерживает статику. Не все библиотеки могут быть построены как статические.
@drescherjm Да, я использовал vcpkg install libssh:x64-windows-static и vcpkg install openssl:x64-windows-static и не могу понять, в чем проблема
Это может помочь проверить, является ли .lib библиотекой импорта или статической библиотекой: https://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import
@drescherjm Честно говоря, я не понимаю, что происходит. Проверил ssh.lib как писали в статье - библиотека полностью статичная, имеет свой .obj и нет .dll, но при этом создает libcrypto-3-x64.dll (удаление которого не дает влияют на работу программы!)
А как насчет libcrypto.lib? Я думал, что либо одна из них была библиотеками импорта, либо, возможно, ваши пути к библиотекам извлекали библиотеки из другого места.
@drescherjm Это тоже статично. Я проверил свой код и заметил, что когда я удаляю ssh.lib (и связанный с ним блок кода), файл dll не создается. С libcrypto.lib таких проблем нет, он работает и не создает dll-файлы.





Дело оказалось в том, что OpenSSL включает в себя две библиотеки: помимо libcrypto.lib есть еще libssl.lib, которую использует ssh.lib. Добавил libssl.lib в список библиотек и всё стало нормально
Многие файлы .lib не содержат полной реализации, а содержат только инструкции по вызову функции из DLL. Не могу сказать, так ли это конкретно здесь.