Я программирую приложение с помощью Visual Studio 2022 на C++, x64 с библиотеками, установленными с помощью vcpkg. Это динамически подключаемые библиотеки.
Я хочу использовать свое приложение как статическое, чтобы запускать его на другом ПК без необходимости устанавливать платформы, создавать установщик или другие зависимости, только один .exe и все. Может называется "Портативный"?
Мой помощник по искусственному интеллекту говорит, что мне следует сначала перейти на Release и изменить параметр генерации кода на «/MT».
Я делаю это и начал экспериментировать с проблемами связывания, потому что мои библиотеки настроены как динамические. Но...
Это именно та проблема, о которой я говорю в этом сообщении? Или у меня есть еще? Я действительно не могу понять Послание.
Severity Code Description Project File Line Suppression State
Error LNK2001 unresolved external symbol "__declspec(dllimport) public: class std::locale __cdecl std::basic_streambuf<char,struct std::char_traits<char> >::getloc(void)const " (__imp_?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEBA?AVlocale@2@XZ) WxWidgets_Structured C:\Users\Juan\source\repos\WxWidgets_Structured\ConfigManager.obj 1
Error LNK1120 1 unresolved externals WxWidgets_Structured C:\Users\Juan\source\repos\WxWidgets_Structured\x64\Release\WxWidgets_Structured.exe 1
«Мой ИИ-помощник говорит» — совет; хватит слушать этого чат-бота, у которого нет настоящего интеллекта. Я не понимаю, почему люди пытаются использовать эти инструменты «ИИ» при написании кода. Чаще всего они приносят больше вреда, чем пользы, и уж точно понятия не имеют, о чем говорят.
Примечание: список ошибок представляет собой краткое описание проблем в коде. Он упускает кое-что, иногда часть информации, которая могла бы полностью раскрыть дело. Вкладка «Вывод», обычно расположенная рядом с вкладкой «Список ошибок», представляет собой полный, необработанный и чистый вывод диагностики сборки в виде обычного текста. Это может быть чертовски пугающим, но при этом ничего не упускается из виду, и, если это не решает проблему за вас, оно очень легко вставляется в сообщение о переполнении стека.
x64 с библиотеками, установленными с помощью vcpkg. Вы использовали один из триплетов, создающих статические библиотеки? https://devblogs.microsoft.com/cppblog/vcpkg-updates-static-linking-is-now-available/
Мой помощник по искусственному интеллекту говорит, что мне следует сначала перейти на Release и изменить параметр генерации кода на «/MT». Это небольшая часть решения, но далеко не вся история. Каждая используемая вами библиотека также должна быть построена как статическая библиотека со статической средой выполнения. Не только ваше приложение. Кроме того, как упоминал @JesperJuhl в первом комментарии, это не всегда возможно.
__declspec(dllimport)
означает, что ожидается ссылка на библиотеку импорта для dll.
Спасибо, за ссылки и советы они были полезны. Я изменю все возможное на статическое и попробую еще раз. Но я действительно хочу отследить это сообщение, как именно можно отследить проблему? Я пишу здесь #includes моих .ConfigManager.cpp и ConfigManager.h #include "ConfigManager.h" #include <nlohmann/json.hpp> #include <fstream> и #pragma Once #include <wx/wx.h> #include <nlohmann/json.hpp> #include "Data.h" #include <fstream> Существуют и другие нестатические библиотеки. Почему ошибка связывания возникает только один раз?
Как только вы захотите использовать что-то, что получаете через DLL, вы не сможете создать статически созданную программу. Полная остановка.
Возможные способы:
большинство библиотек входят либо в динамические, либо в статические библиотеки: проверьте (дважды), предоставляются ли используемые вами пакеты также как статические библиотеки.
Существует несколько программных инструментов для упаковки одного файла. Например py2exe
или pyinstaller
возьмите интерпретатор Python, один или несколько скриптов и необходимые библиотеки, упакуйте все в своего рода zip-архив вместе с загрузчиком, который распаковывает все во временную папку, а затем запустите интерпретатор Python с его основным скриптом. Вероятно, вы могли бы адаптировать самораспаковывающийся zip-файл для немедленного запуска программы после распаковки архива, содержащего программу и необходимую DLL.
Но на самом деле это сводится к тому, что сначала создается установщик, а затем он немедленно запускает код и очищает установку после использования. Вы можете поискать, можно ли настроить InnoSetup NSIS, чтобы получить это...
Одна из моих библиотек недоступна в статическом виде. Поэтому попробую ваш второй вариант.
Я установил все библиотеки:
в его статической версии успешно использовал:
./vcpkg install <packet>:x64-windows-static
./vcpkg integrate install
новый запуск визуальной студии и переход на «/MT»
но.. Точно такая же проблема происходит...
как мне продолжить?
Должен ли я удалить ссылки на .dll в свойствах и добавить ссылку на статические библиотеки? Или vcpkg делает это автоматически.
Если нужно, как я могу это сделать?
Примечание: скомпилировать программу со всем, что связано статически, не всегда возможно — просто говорю. Вы также можете увидеть stackoverflow.com/questions/12573816/…