Visual Studio 2010 генерирует исполняемый размер больше - PullRequest
9 голосов
/ 02 марта 2011

У меня есть приложение C ++, изначально написанное для Visual Studio 6.0

Это стандартное API-интерфейс Win32, без MFC (* Edit 2), без .NET, со статической связью, многопоточный исполняемый файл.

Я перенес все версии Visual Studio до 2010 года (сегодня) и до сих пор проблем не было:

Он отлично компилируется и работает с VS2010, НО сгенерированный исполняемый файлразмер в четыре (4) раза больше!

Я перепробовал все известные мне варианты (оптимизации, удалить отладочную информацию и т. д.) без результатов.Конечно, я новичок в VS2010, но не в Visual Studio.

Кто-нибудь сталкивался с этой проблемой?Опять же: я НЕ использую какие-либо фреймворки, это сырое, статически связанное, Win32-приложение, без DLL, без ODBC, без сети, без .NET

Надеюсь снова увидеть мои исполняемые файлы маленькими, спасибодля любого ввода.

  • Редактировать 1: Оригинальный размер = 626 КБ (VS6.0, VS2008) Размер раздутого = 2.013 КБ (VS2010)

  • Редактировать 2: После некоторых исследований и дампов, я обнаружил скрытую ссылку на MFC.Первоначально я сказал, что он не использует MFC, но это так.

Ответы [ 5 ]

2 голосов
/ 01 октября 2011

Если вы используете статическое связывание, я предлагаю использовать переключатели компоновщика, если вы компилируете в командной строке, используя синтаксис:

cl / Ox [ваши исходные файлы C ++] [требуются библиотеки, если есть] [требуются файлы ресурсов, если есть] / link / FILEALIGN: 512 / OPT: REF / OPT: ICF / INCREMENTAL: NO

Если вы строите в Visual Studio IDE, вы проверяете настройки компоновщика, выбирая свойства проекта из меню. В конфигурации выберите Release, а затем нажмите на параметры компоновщика, найденные на левой панели, это покажет вам список конфигураций, соответствующих настройкам компоновщика, которые в настоящее время установлены по умолчанию.

В командной строке под компоновщиком укажите параметр / FILEALIGN: 512 в поле «Дополнительные параметры», затем нажмите кнопку «Применить». В разделе «Общие» под компоновщиком отключите инкрементное связывание, выбрав «Нет» (/ INCREMENTAL: NO). В параметре отладки компоновщика выберите «Нет» для «Создать отладочную информацию». Для оптимизации компоновщика вы выбираете «Устранить данные без ссылок (/ OPT: REF)» в «Ссылки» и «Удалить избыточные COMDAT» (/ OPT: ICF) в сворачивании «Включить COMDAT».

Для оптимизации компилятора убедитесь, что выбрана конфигурация выпуска, щелкните представление дерева C / C ++ на левой панели и под ним нажмите Оптимизация, выберите Полная оптимизация (/ Ox). В разделе «Общие» в разделе «C / C ++» выберите «Отключено» для формата информации об отладке.

Не забудьте нажимать кнопку Применить для каждого внесенного вами изменения.

Я надеюсь, что все, что я упомянул здесь, было бы полезно для вас, и все это относится к Visual C ++ 2005 и 2008, но, надеюсь, это также относится к Visual C ++ 2010, если нет, пожалуйста, проверьте документацию, прилагаемую к вашему Visual Установка C ++ 2010.

2 голосов
/ 04 апреля 2011

Увеличение размера может быть вызвано изменениями в МФЦ. Здесь - это объяснение, а здесь - это обходной путь того же автора, который возвращает размер исполняемого файла обратно в регионы, где это было с 2008 г. Обходное решение включает редактирование копий исходных файлов MFC.тем не менее, этот процесс может удовлетворить не всех, и его нужно повторять после каждого обновления, например, после установки пакета обновления для Visual Studio.

Обновление:

Похоже на OPне использует MFC, поэтому это могут быть две разные проблемы.Я сам испытал увеличение размера, но, к сожалению, не могу сказать, вызван ли он MFC или нет, так как мой проект статически связан с MFC.

1 голос
/ 14 апреля 2011

Это связано с тем, что в VS2010 Microsoft добавила функциональные возможности, позволяющие HTML-компонентам в диалоговых окнах, таким образом, связывать кучу вещей, даже если вы ими не пользуетесь, а оптимизации и опции, а также удаление кода без ссылок не помогают.Не существует «хорошего» способа удаления кода, но есть некоторые взломанные.Мы скомпилировали наш материал, критичный к размеру, на VS2008 еще из-за этого.Заметьте, наш код без графического интерфейса на самом деле компилируется меньше.Надеюсь, что MS предлагает вариант для этого в исправлении / патче, так что я могу делать все на VS2010, но я не задерживаю дыхание ...

1 голос
/ 16 марта 2011

См. Существуют ли какие-либо инструменты для отслеживания раздувания в C ++? - там описаны некоторые методы анализа того, что влияет на размер исполняемого файла. Как только вы выполните анализ выходных данных VC 6 и VS 2010, надеюсь, вы найдете что-то полезное.

Есть одна особенность, которая меня поразила при портировании с VC 6 на какую-то редакцию Visual Studio: значение некоторых параметров оптимизации изменилось, а значения, которые я использовал в проекте VC 6, больше не поддерживались, и в результате exe, созданный VS, вообще не был оптимизирован, вызывая как раздувание исполняемого файла, так и низкую производительность. Проверьте настройки оптимизации в Свойствах / C / C ++ / Оптимизация и убедитесь, что оптимизация включена / Ox, / O2 или /O1.

1 голос
/ 06 марта 2011

Есть ли шанс, что вы оставили целевую платформу по умолчанию на «Любой процессор»?Если это так, измените его на x86 для 32-битного кода.Я предполагаю, что это составит большую часть разницы.Остальное, вероятно, связано с изменениями в оптимизации компилятора (более агрессивное развертывание циклов и тому подобное, где размер был продан за скорость, поскольку оперативная память дешева).Я считаю, что все гранулярные оптимизации по-прежнему доступны из командной строки, но многие из них были скрыты на панелях параметров пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...