Как я могу установить директиву $ RTTI для всего проекта? - PullRequest
4 голосов
/ 15 января 2010

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

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

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

Ответы [ 5 ]

5 голосов
/ 11 декабря 2014

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

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

4 голосов
/ 15 января 2010

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

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

1 голос
/ 05 января 2011

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

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

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

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

1 голос
/ 15 января 2010

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

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

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

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

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

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

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

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

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

...