Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Visual C++ 2008 Express Edition: от чего зависит размер исполняемого файла?  (Прочитано 9558 раз)
0 Пользователей и 1 Гость смотрят эту тему.
urock
Участник

ru
Offline Offline

« : 30-03-2010 09:45 » 

Добрый день!

Есть проект, сделанный еще под Visual Studio 6.0. Я его конвертнул в формат Visual C++ 2008 Express Edition и работаю соответственно в этой новой среде. При сборке проекта исполняемый файл получается примерно под 500KB (в этом случае программа работает и на машине, где она собиралась и на других машинах - дальше будет ясно). Есть теперь желание не работать в конвертированном проекте, а создать его заново из тех же самых исходных файлов. Создаю, собираю, exe файл получается порядка 50 KB, т.е. в 10 раз меньше. Ладно думаю, не все библиотеки были включены в образ исполняемого файла, но тут возникает проблема. Эта программа отказывается запускаться на других машинах, т.е. на той, где собираю - работает, а на других при запуске возникает ошибка. Приложение не было запущено, поскольку оно некорректно настроено.

Я так понимаю дело в том, что в случае меньшего исполняемого файла не все функции были включены в этот файл, а некоторые вызываются из динамических библиотек. В случае же большего файла весь необходимый код для работы программы был собран в одном файле. Разумное объяснение?

Вопрос: как при сборке проекта в Visual C++ 2008 Express Edition "с нуля" сделать так, чтобы весь код включался в исполняемый файл? Я уже облазил все меню и проверил соответствие всех полей в проекте, собранным "с нуля" и конвертированном из Visual Studio 6.0.

Гуру, помогите)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 30-03-2010 11:12 » 

urock, забей на жалкие 450 кб Улыбаюсь Если, конечно, не жаль времени. Я довольно большой проект портировал с 6 на 2008 - и очень радуюсь, что это довольно легко произошло и не пришлось с нуля перебацивать (заняло бы месяц)

По второй проблеме - в настройках проекта поставить "использовать MFC в статических библиотеках" , а если у тебя не MFC - то что -то подобное, полагаю, там есть тоже
« Последнее редактирование: 30-03-2010 11:14 от Алексей1153++ » Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 30-03-2010 11:14 » 

Вероятнее всего, по умолчанию runtime-библиотека динамически линкуется:
Properties->"Configuration Properties"->"C/C++"->"Code Generation", опция "Runtime library". Заменить "XXX DLL" на соответствующее "XXX" (без DLL).
Ну, или как Лёша говорит: MFC - если таковой используется.
Записан
urock
Участник

ru
Offline Offline

« Ответ #3 : 30-03-2010 11:43 » 

Спасибо, заработало

У меня Runtime Library было Multi-threaded Debug DLL, изменил просто на Multi-threaded Debug, тогда размер файла вырос, и программа начала запускаться на других машинах.

Раз уж влез в это, интересно понять, почему при динамическом подключении runtime библиотеки моя программа не запускается на других машинах? Зависит от верcии Windows? На девелоп машине у меня WinXP SP3, а на таргет машине ... тоже! WinXP SP3 (тока что глянул Улыбаюсь) Какие-то дополнительные пакеты надо ставить?
Но Microsoft Visual C++ 2008 Redistributable - x86 у меня стоит и там и там, причем одной даже версии.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 30-03-2010 11:46 » 

urock, зависит от наличия студии 2008 на машине Улыбаюсь
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 30-03-2010 11:54 » 

Зависит от наличия DLL на машине. Раз Runtime в dll-ке, то при запуске программа пытается эту dll-ку подгрузить. Соответственно, на машинах без VS эта dll-ка быть не обязана: либо надо с собой тащить, либо линковать статически.
Записан
urock
Участник

ru
Offline Offline

« Ответ #6 : 30-03-2010 12:05 » 

не понял, можно поподробней?

Программы используют динамические библиотеки и без наличия установленной той или иной среды разработки. Что же получается в моем случае? Прошу простить дилетанта, фундаментальное образование физикам не дают)

Вад, ты о какой dll говоришь? о неких внешних по отношению к моей программе, из которых вызываются некоторые функции? или на основании моего кода неявно создается dll, храниться где-то, где только VS знает, и потом вызывается?

Просто если dll внешние, то никак не могу понять, зачем нужна среда разработки для того чтобы их запустить) Как же тогда вообще пишутся распространяемые в широком кругу программы? Не у каждого же на машине стоит среда разработки... Получается, что все такие программы линкуются статически?
Записан
urock
Участник

ru
Offline Offline

« Ответ #7 : 30-03-2010 12:09 » 

фундаментальное образование по программированию не дают, я имею в виду. все самим приходится)
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 30-03-2010 12:20 » 

В VS уже есть скомпилированные версии для стандартной библиотеки.
Поскольку программа так или иначе использует код стандартных библиотек (даже если этого не видно), эти библиотеки должны быть прилинкованы к программе, чтобы она могла вызывать этот код. Соответственно, раньше вариантом по умолчанию была статическая линковка: когда стандартная библиотека влинковывается в исполняемый файл намертво. А в новых версиях VS по умолчанию используется опция динамической линковки, когда libcmt.dll и т.п. библиотеки должны прилагаться к исполняемому файлу.
« Последнее редактирование: 30-03-2010 12:21 от Вад » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines