В новом приложении VCL Компиляция и операция Сборки производят тот же двоичный файл и файл карты (с незначительными различиями в конце .exe файла, даже если "включают информацию о версии в проект" опция, выключен - уже обсужденный). Файл карты является тем же байтом к байту. Но жировик, я добавляю любой сторонний компонент двоичный файл и файл карты (!), произведенный Сборкой и Компиляцией, существенно отличается!
Протестированный на двух версиях Delphi:
- Версия 7.0 (Сборка 8.1)
- Версия 11.0.2902.10471 CodeGear™ RAD Studio 2007 (+December обновление 2007 года)
Шаг для репродуцирования:
У нас есть небольшие различные .exe файлы и полностью идентичные .map файлы. Затем, если мы повторяем все шаги снова, но используем в стороннем компоненте проекта (я пробую ODAC, DOA, DevExpress и самодельный), мы получаем более другой .exe и различные .map файлы.
Почему? Какие-либо предложения?
ОБНОВЛЕНИЕ
Некоторая информация о том, как я нашел это и почему это, интересует меня:
Проект является сборкой из простого сценария с MSBuild. Когда в проекте был добавленный перевод через ITE (dll с ресурсами), я нашел это, когда проект был Сборкой (из сценария или от IDE) - переведенной работы версии неправильно - некоторый текст на кнопке, маркировки, и т.д. полученные от неправильного места (буквально от другой кнопки, маркировок). Когда проект, Скомпилированный от IDE - все в порядке. Таким образом, я запускаю, сравнивают вывод Сборки и Компиляции...
То, что вы видите, просто артефакт встроенной make логики компилятора. Когда вы делаете сборку, он говорит компилятору собрать все доступные исходные тексты. Таким образом, Delphi обрабатывает каждый исходный файл, и для каждой единицы в списках использования, для которой он находит исходный текст, он собирает этот файл. Он делает это рекурсивно. Когда вы выполняете компиляцию, загружаются только существующие файлы .dcu, и если они признаны актуальными, ничего не делается. На самом деле это может привести к другому порядку обнаружения модулей, так как каждый .dcu будет эффективно "сплющивать" список использования. Так как юниты обнаруживаются и загружаются в другом порядке, они в свою очередь связаны друг с другом в другом порядке. Вот почему ваши картографические файлы выглядят так по-другому. Учитывая одни и те же источники, файл карты должен быть одинаковым, если вы делаете две сборки подряд или две компиляции подряд.
Другие причины различий более прозаичны и включают такие вещи, как временная метка заголовка PE, а также другие биты подкладки и выравнивания.
На мой взгляд, этот ответ состоит из двух частей.
Часть проблемы, которую вы видите, IIRC, заключается в том, что компилятор не обнуляет память перед выполнением компиляции/сборки. Таким образом, всё, что остаётся в неинициализированной памяти, становится заполнением в выводе для выравнивания.
Я также, кажется, помню, что в информацию о заголовке pe для приложения включена метка времени даты, которая каждый раз будет вызывать разницу.
Я не лучший человек, чтобы подтвердить это, но это то, что я, кажется, помню из прошлых обсуждений.
Такие люди, как Аллен Бауэр или Барри Келли, вероятно, могли бы дать лучшую/более точную информацию по этому вопросу.
.Если вы используете компилятор, определяют в вашем проекте, и просто изменились тем, что если вы делаете компиляцию, вы не увидите никаких изменений в DCU и полученный модуль (EXE или DLL). Если вы сделаете полный восстановитель, определяет компилятор, используются в вновь созданных DCU и модулях.
Я видел это в большой группе проекта, где мы используем модули в разных проектах с различными определяющими, и все DCU хранятся в одном каталоге.
Ergo: Компилятор не обеспечивает зависимости от определения в этом случае.
Возможно, вы видели ту же проблему.