Как настроить мои библиотеки и зависимости для компиляции моего приложения как статического

Я программирую приложение с помощью 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   

Примечание: скомпилировать программу со всем, что связано статически, не всегда возможно — просто говорю. Вы также можете увидеть stackoverflow.com/questions/12573816/…

Jesper Juhl 27.06.2024 20:18

«Мой ИИ-помощник говорит» — совет; хватит слушать этого чат-бота, у которого нет настоящего интеллекта. Я не понимаю, почему люди пытаются использовать эти инструменты «ИИ» при написании кода. Чаще всего они приносят больше вреда, чем пользы, и уж точно понятия не имеют, о чем говорят.

Jesper Juhl 27.06.2024 20:23

Примечание: список ошибок представляет собой краткое описание проблем в коде. Он упускает кое-что, иногда часть информации, которая могла бы полностью раскрыть дело. Вкладка «Вывод», обычно расположенная рядом с вкладкой «Список ошибок», представляет собой полный, необработанный и чистый вывод диагностики сборки в виде обычного текста. Это может быть чертовски пугающим, но при этом ничего не упускается из виду, и, если это не решает проблему за вас, оно очень легко вставляется в сообщение о переполнении стека.

user4581301 27.06.2024 20:53

x64 с библиотеками, установленными с помощью vcpkg. Вы использовали один из триплетов, создающих статические библиотеки? https://devblogs.microsoft.com/cppblog/vcpkg-updates-static-‌​linking-is-now-avail‌​able/

drescherjm 27.06.2024 21:43

Мой помощник по искусственному интеллекту говорит, что мне следует сначала перейти на Release и изменить параметр генерации кода на «/MT». Это небольшая часть решения, но далеко не вся история. Каждая используемая вами библиотека также должна быть построена как статическая библиотека со статической средой выполнения. Не только ваше приложение. Кроме того, как упоминал @JesperJuhl в первом комментарии, это не всегда возможно.

drescherjm 27.06.2024 21:45

__declspec(dllimport) означает, что ожидается ссылка на библиотеку импорта для dll.

drescherjm 27.06.2024 21:51

Спасибо, за ссылки и советы они были полезны. Я изменю все возможное на статическое и попробую еще раз. Но я действительно хочу отследить это сообщение, как именно можно отследить проблему? Я пишу здесь #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> Существуют и другие нестатические библиотеки. Почему ошибка связывания возникает только один раз?

juanlg 28.06.2024 15:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как только вы захотите использовать что-то, что получаете через DLL, вы не сможете создать статически созданную программу. Полная остановка.

Возможные способы:

  • большинство библиотек входят либо в динамические, либо в статические библиотеки: проверьте (дважды), предоставляются ли используемые вами пакеты также как статические библиотеки.

  • Существует несколько программных инструментов для упаковки одного файла. Например py2exe или pyinstaller возьмите интерпретатор Python, один или несколько скриптов и необходимые библиотеки, упакуйте все в своего рода zip-архив вместе с загрузчиком, который распаковывает все во временную папку, а затем запустите интерпретатор Python с его основным скриптом. Вероятно, вы могли бы адаптировать самораспаковывающийся zip-файл для немедленного запуска программы после распаковки архива, содержащего программу и необходимую DLL.

    Но на самом деле это сводится к тому, что сначала создается установщик, а затем он немедленно запускает код и очищает установку после использования. Вы можете поискать, можно ли настроить InnoSetup NSIS, чтобы получить это...

Одна из моих библиотек недоступна в статическом виде. Поэтому попробую ваш второй вариант.

juanlg 01.07.2024 15:53

Я установил все библиотеки:

  • nlohman-json
  • втк
  • wxвиджеты
  • open62541

в его статической версии успешно использовал:

./vcpkg install <packet>:x64-windows-static
./vcpkg integrate install

новый запуск визуальной студии и переход на «/MT»

но.. Точно такая же проблема происходит...

как мне продолжить?

Должен ли я удалить ссылки на .dll в свойствах и добавить ссылку на статические библиотеки? Или vcpkg делает это автоматически.

Если нужно, как я могу это сделать?

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

Похожие вопросы

Принципы и практика программирования Страуструпа, 3-е издание, графика: почему передача функции обратного вызова в Window::timer_wait дает неожиданные результаты?
Почему я получаю ошибки «неопределенной ссылки» при попытке использовать OpenCV в Qt Creator с MinGW?
ESP-IDF: Модульные тесты с Unity и C++
Как передать constexpr в конструктор?
При поиске количества точек внутри некоторой фигуры с помощью KD-Tree нужно ли нам проверять пересечение областей или просто сравнивать свойства, соответствующие глубине?
Использование std::enable_if во избежание неоднозначной перегрузки шаблонных бинарных операторов
Арифметическая ошибка, вызванная опцией -O3 в g++
Наследовать сразу или наследовать по одному
Как передать интерактивную оболочку удаленной программы в стандартный вывод работающей программы на C++, которая запустила удаленную программу (с использованием BSUB -I)
Ошибка возврата массива из функции consteval