Компиляция Delphi и Сборка производят другой двоичный файл на том же проекте

В новом приложении VCL Компиляция и операция Сборки производят тот же двоичный файл и файл карты (с незначительными различиями в конце .exe файла, даже если "включают информацию о версии в проект" опция, выключен - уже обсужденный). Файл карты является тем же байтом к байту. Но жировик, я добавляю любой сторонний компонент двоичный файл и файл карты (!), произведенный Сборкой и Компиляцией, существенно отличается!

Протестированный на двух версиях Delphi:
- Версия 7.0 (Сборка 8.1)
- Версия 11.0.2902.10471 CodeGear™ RAD Studio 2007 (+December обновление 2007 года)

Шаг для репродуцирования:

  1. Создайте Новое Приложение VCL. Возможно добавьте любой собственный компонент Delphi (я пробую все компоненты от Стандарта, Дополнительного, вкладка Win32 и System).
  2. Включите Подробный файл Карты на вкладке Linker Опций Проекта.
  3. Разработайте проект.
  4. Переименуйте вывод .exe и .map файл (например: project1.exe к project1b.exe и project1.map к project1b.map).
  5. Скомпилируйте проект.
  6. Переименуйте вывод .exe и .map файл (например: project1.exe к project1c.exe и project1.map к project1c.map).
  7. Сравните файлы от шага 4 и 6. (Я использую WinMerge 2.12.4.0).

У нас есть небольшие различные .exe файлы и полностью идентичные .map файлы. Затем, если мы повторяем все шаги снова, но используем в стороннем компоненте проекта (я пробую ODAC, DOA, DevExpress и самодельный), мы получаем более другой .exe и различные .map файлы.

Почему? Какие-либо предложения?

ОБНОВЛЕНИЕ
Некоторая информация о том, как я нашел это и почему это, интересует меня:
Проект является сборкой из простого сценария с MSBuild. Когда в проекте был добавленный перевод через ITE (dll с ресурсами), я нашел это, когда проект был Сборкой (из сценария или от IDE) - переведенной работы версии неправильно - некоторый текст на кнопке, маркировки, и т.д. полученные от неправильного места (буквально от другой кнопки, маркировок). Когда проект, Скомпилированный от IDE - все в порядке. Таким образом, я запускаю, сравнивают вывод Сборки и Компиляции...

5
задан S.L. Barth - Reinstate Monica 24 July 2012 в 08:52
поделиться

3 ответа

То, что вы видите, просто артефакт встроенной make логики компилятора. Когда вы делаете сборку, он говорит компилятору собрать все доступные исходные тексты. Таким образом, Delphi обрабатывает каждый исходный файл, и для каждой единицы в списках использования, для которой он находит исходный текст, он собирает этот файл. Он делает это рекурсивно. Когда вы выполняете компиляцию, загружаются только существующие файлы .dcu, и если они признаны актуальными, ничего не делается. На самом деле это может привести к другому порядку обнаружения модулей, так как каждый .dcu будет эффективно "сплющивать" список использования. Так как юниты обнаруживаются и загружаются в другом порядке, они в свою очередь связаны друг с другом в другом порядке. Вот почему ваши картографические файлы выглядят так по-другому. Учитывая одни и те же источники, файл карты должен быть одинаковым, если вы делаете две сборки подряд или две компиляции подряд.

Другие причины различий более прозаичны и включают такие вещи, как временная метка заголовка PE, а также другие биты подкладки и выравнивания.

10
ответ дан 18 December 2019 в 14:46
поделиться

На мой взгляд, этот ответ состоит из двух частей.

Часть проблемы, которую вы видите, IIRC, заключается в том, что компилятор не обнуляет память перед выполнением компиляции/сборки. Таким образом, всё, что остаётся в неинициализированной памяти, становится заполнением в выводе для выравнивания.

Я также, кажется, помню, что в информацию о заголовке pe для приложения включена метка времени даты, которая каждый раз будет вызывать разницу.

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

Такие люди, как Аллен Бауэр или Барри Келли, вероятно, могли бы дать лучшую/более точную информацию по этому вопросу.

.
3
ответ дан 18 December 2019 в 14:46
поделиться

Если вы используете компилятор, определяют в вашем проекте, и просто изменились тем, что если вы делаете компиляцию, вы не увидите никаких изменений в DCU и полученный модуль (EXE или DLL). Если вы сделаете полный восстановитель, определяет компилятор, используются в вновь созданных DCU и модулях.

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

Ergo: Компилятор не обеспечивает зависимости от определения в этом случае.

Возможно, вы видели ту же проблему.

0
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

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