Как я могу установить директиву $RTTI для всего проекта?

Я работаю над переносом старого проекта с Delphi 2007 на Delphi 2010. Одна вещь, которую я обнаружил, заключается в том, что полученный исполняемый файл имеет более чем удвоенный размер, а оригинал уже был довольно большим. (Более 50 МБ.) Я подозреваю, что многое из этого связано с расширенным RTTI.

Поскольку проект предшествовал Delphi 2010, он нигде не использует расширенный RTTI, и я хотел бы быть осторожным в отношении его включения. Есть ли способ использовать диалоговое окно параметров проекта, чтобы глобально установить {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} по умолчанию? Я бы ожидал, что будет возможность для этого (и для $WEAKLINKRTTI) где-то, но я их не вижу.

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

5 ответов

Поведение директивы $RTTI было изменено с XE6, потому что на самом деле это была ошибка, потому что она должна была быть локальной для текущего модуля (и фактически была задокументирована как таковая с Delphi 2010).

Также это может иметь фатальные последствия при использовании директивы вообще даже в одном модуле, потому что из-за ошибки он в основном переключал глобальный флаг, влияющий на следующие модули (как в порядке компиляции).

Вы можете попробовать с dcc32 –$weaklinkrtti опция командной строки. (лайк {$WEAKLINKRTTI ON}).
Но это не влияет {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} в каждом блоке.
Лучше всего, чтобы он был вверху каждого блока во включаемом файле.
Но тогда он не будет делать это для VCL/RTL, который все еще будет раздут.

Обновление: также убедитесь, что вы сравниваете то, что сопоставимо. Например, проверьте, не включаете ли вы отладочную информацию в Опции компоновщика в новом проекте D2010, где она может отсутствовать в проекте D2007...

В комментарии к собственному блогу Мейсона, в ответ на мой комментарий, Мейсон ответил на этот вопрос.

Попробуйте поместить эти две строки вверху вашего DPR перед предложением USES:

{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

Это гарантирует, что RTTI не будет сгенерирован для вашего собственного кода или любых сторонних библиотек, которые вы используете, если только они не находятся в блоке, где явно не включена генерация RTTI. Вы не можете отключить его для RTL или VCL, но это не должно сильно увеличить ваш размер.

Вы уверены, что это вызвано новой информацией RTTI? Хотя данных много, на самом деле они не должны удваивать размер вашего приложения.

Убедитесь, что она не включает отладочную информацию в исполняемый файл сборки выпуска. (Параметры проекта -> Delphi Compiler -> Отладочная информация должна быть ложной)

Что касается вопроса, я использую {$WEAKLINKRTTI ON} перед предложением использования в файле dpr, и, похоже, он работает нормально.

Я не знаю такой опции, но я все еще использовал бы включаемый файл.

Для любого опытного программиста на Delphi у меня не возникнет проблем с написанием небольшой программы для добавления {$i ProjectIncludeFile.inc} к любому устройству в ваших папках (сразу после строки устройства).

И таким образом вы можете использовать его для любых целей, которые вам нравятся.

Я сам использую, если фи, чтобы установить WriteTempFiles директива компилятора (которую я использую fi для сохранения содержимого списка строк в разных местах при разработке программы), таким образом, я могу отключить его в одном месте, когда программа готова к развертыванию.

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

Другие вопросы по тегам