Delphi компилируется и строится производить различные бинарны на одном и том же проекте

StackOverflow https://stackoverflow.com/questions/2013312

Вопрос

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

Протестировано на двух версиях Delphi:
- Версия 7.0 (сборка 8.1)
- Codegear ™ Rad Studio 2007 Версия 11.0.2902.10471 (+декабрь 2007 г. Обновление)

Шаг к воспроизведению:

  1. Создайте новое приложение VCL. Возможно, добавьте любой собственный компонент Delphi (я пробую все компоненты из STANDART, дополнительного, WIN32 и System вкладки).
  2. Включите подробный файл карты на вкладке «Линкер» параметров проекта.
  3. Строить проект.
  4. Переименовать выход.
  5. Компиляция проекта.
  6. Переименовать выход.
  7. Сравните файлы с шага 4 и 6. (я использую Winmerge 2.12.4.0).

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Я полагаю, что в этом ответе есть две части.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top