#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)