#cpp #visual_studio #cppbuilder #visual_studio_2012 #visual_cpp
Доброго времени суток! Разрабатываю понемножку с использовванием visual studio(13), и постоянно мучит особенность сборки под винду, которая заключается в следующем: для корректной работы на другом компьютере необходимо ручками докладывать библиотеки, которые приложение просит на выходе. В то же время, когда приложение собирается в релизе и запускается, то студия автоматически подкадывает нужные библиотеки, что б приложение могло запуститься. Что необходимо сделать для того что бы студия скопировала все необходимые для работы библиотеки в папку рядом с ехе-шником?
Ответы
Ответ 1
Стандартно, в студии ничего подобного не предусмотрено. Предпологается, что разработчик сам знает какие библиотеки используются в его проекте и сам ими управляет. Однако, есть библиотеки которые могут линковаться неявно, при этом способ линковки (статическая/динамическая) можно настраивать в параметрах проекта: CRT - настраивается параметром "C/C++\Code Generation\Runtime Library", по-умолчанию включена динамическая линковка и именно из-за нее у новичков возникают проблемы при распространении ПО; если включить статическую линковку то DLL тянуть не потребуется. MFC - настраивается "General\Use of MFC", по-умолчанию не используется ATL - настраивается "General\Use of ATL", по-умолчанию не используется Проблема в том, что на машине разработчика все эти библиотеки устанавливатся вместе со студией и поэтому ПО запускается из любого места. А вот на машине пользователя этих библиотек часто нет, от сюда у новичков и возникают проблемы. Проблема решается либо статической линковкой, либо установкой соответсвующих пакетов (редистов) нужных версий (ссылки успешно яндексятся на сайте Майкрософта) Вторая проблема в том, что при автоматической загрузке DLL, требуется чтобы все библиотеки в пределах одного бинаря линковались одинаково. Это означает, например, что если QT слинковам с CRT динамически то и наш бинарь должен линковать CRT динамически. Это можно обойти, если применять не автоматическую а ручную загрузку DLL, но тогда гемор разрастется многократно. Проще немного увеличить инсталянт в размере, може мне поверить.Ответ 2
Для корректной работы на другом компьютере, при настройках сборки по умолчанию (то есть с ключом /MD), нужно установить Microsoft VC++ Redistributable (2013, в данном случае), корректной архитектуры (x86 или amd64, в зависимости от настроек сборки). Класть эти файлы (msvcxxx120.dll) в папку приложения абсолютно некорректно, ибо нарушается механизм их корректной регистрации в системе и обновления (На машинах с включенным Windows Update VC++ redistributables сами обновляются, в папке же приложения останутся старые версии, в том числе с неустраненными уязвимостями) Некорректно распространять Debug-версии этих файлов (при сборке в Debug-конфигурации, с ключом /MDd, используются версии библиотек с d на конце (msvcr120d.dll), соответственно перед распространением приложения нужно убедиться что включена Release-конфигурация. Для простого приложения, состоящего из одного exe-файла, зависимости от CRT-библиотек можно избежать, собрав с ключом /MT, что незначительно увеличит приложение в размере, однако при сложном приложении, состоящем из множества библиотек - в размере увеличится каждая библиотека, и выигрыш теряется. При использовании сторонних библиотек/фреймворков (Qt, boost, и т.д.) следует проследить, что их библиотеки собраны в точном соответствии с конфигурацией приложения - приложение, собранное с /MD при попытке использования Qt, собранного с /MT и наоборот (а так же если сторонняя библиотека собрана с другой версией CRT, например msvcr90.dll) практически гарантировано вызовет ошибки и вылетыОтвет 3
Помогло указывание в свойствах проекта /MT (/MTd): Properties -> Configuration Properties -> C/C++ -> All Options -> Runtime Library -> Multi-threaded (/MT) (или Multi-threaded Debug (/MTd)) а также указывание платформы Windows XP: Properties -> Configuration Properties -> General -> Platform Toolset -> Visual Studio 2013 - Windows XP (v120_xp)
Комментариев нет:
Отправить комментарий