Delphi Compile и Build создают разные двоичные файлы в одном проекте - PullRequest
5 голосов
/ 06 января 2010

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

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

Шаг для воспроизведения:

  1. Создание нового приложения VCL. Возможно добавить любой родной компонент Delphi (я пробую все компоненты из вкладки Standart, Additional, Win32 и System).
  2. Включите файл «Подробная карта» на вкладке «Линкер» параметров проекта.
  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 и selfmade), мы получим больше разных .exe и разных файлов .map.

Почему? Есть предложения?

UPDATE
Немного информации о том, как я нашел это и почему это меня интересует:
Проект построен из простого скрипта с MSBuild. Когда в проект был добавлен перевод через ITE (dll с ресурсами), я обнаружил, что когда проект был Build (из скрипта или из IDE) - переведенная версия работает неправильно - какой-то текст на кнопке, метки и т. Д. Был получен из неправильного места (буквально из другого кнопка, метки). Когда проект скомпилирован из IDE - все ок. Поэтому я начинаю сравнивать результаты сборки и компиляции ...

Ответы [ 3 ]

10 голосов
/ 06 января 2010

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

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

3 голосов
/ 06 января 2010

В этом ответе есть две части.

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

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

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

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

0 голосов
/ 08 января 2010

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

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

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

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

...