4

古いプロジェクトを Delphi 2007 から Delphi 2010 に移行する作業を行っています。結果の実行可能ファイルのサイズが 2 倍以上になり、元のプロジェクトはすでにかなり大きいことがわかりました。(50 MB を超えています。) その多くは RTTI の拡張に関係していると思われます。

このプロジェクトは Delphi 2010 よりも前のものであるため、拡張 RTTI はどこにも使用されていません。Project Options ダイアログを使用してグローバル{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}にデフォルトとして設定する方法はありますか? これ (および ) のオプションが$WEAKLINKRTTIどこかにあると期待していましたが、それらは表示されません。

これが「コンパイラに渡す追加オプション」フィールドから、または他の方法で実行できるかどうかを知っている人はいますか? プロジェクトのすべてのユニットにインクルード ファイルを追加する必要はありません。数千のユニットがあるためです...

4

5 に答える 5

6

$RTTI ディレクティブの動作は XE6 以降に変更されました。これは、現在のユニットに対してローカルであると想定されていたため、実際にはバグであったためです (実際には、Delphi 2010 以降、そのように文書化されていました)。

また、バグのために基本的に次のユニットに影響を与えるグローバルフラグを切り替えるため、1つのユニットでもディレクティブを使用すると致命的な影響を与える可能性があります(コンパイルの順序など)。

于 2014-12-11T16:35:20.937 に答える
4

dcc32 –$weaklinkrttiコマンドラインオプションで試すことができます。(のように{$WEAKLINKRTTI ON})。しかし、それは各ユニット
の影響はありません。 あなたの最善の策は、インクルード ファイルの各ユニットの先頭に配置することです。 しかし、それでは、まだ膨張している VCL/RTL ではそれができません....{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

更新: また、比較可能なものを必ず比較してください。たとえば、新しい D2010 プロジェクトのリンカー オプションにデバッグ情報が含まれていないかどうかを確認します。D2007 プロジェクトには含まれていない可能性があります...

于 2010-01-15T03:07:58.140 に答える
2

Mason 自身のブログへのコメントで、私のコメントに応えて、Mason はこの質問に答えました。

DPR の先頭、USES 句の前に次の 2 行を追加してみてください。

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

これにより、RTTI 生成が明示的に有効になっているユニットにない限り、独自のコードまたは使用するサードパーティ ライブラリに対して RTTI が生成されないようになります。RTL や VCL に対してオフにすることはできませんが、いずれにせよサイズが大きく増えることはありません。

于 2011-01-05T11:42:27.893 に答える
1

これは新しい RTTI 情報が原因であると確信していますか? 大量のデータですが、アプリケーションのサイズが 2 倍になることはありません。

リリース ビルドの実行可能ファイルにデバッグ情報が含まれていないことを確認します。(プロジェクト オプション -> Delphi コンパイラ -> デバッグ情報は False である必要があります)

質問に関しては、dpr ファイルの uses 句の前に {$WEAKLINKRTT ON} を使用していますが、問題なく動作しているようです。

于 2010-01-15T09:45:51.143 に答える
0

私はそのようなオプションを知りませんが、それでもインクルード ファイルを使用します。

経験豊富な Delphi プログラマーが小さなプログラムを作成して{$i ProjectIncludeFile.inc}、フォルダー内の任意のユニット (ユニット行の直後) に追加することは問題になりません。

そうすれば、好きな目的で使用できます。

私自身、if fi を使用してWriteTempFilesコンパイラ ディレクティブを設定します (プログラムの開発時に fi を使用してさまざまな場所で文字列リストの内容を保存します)。これにより、プログラムの展開の準備が整ったときに 1 か所で無効にすることができます。

私のプロジェクトのほとんどには複数の実行可能ファイルや dll が含まれているため、これがプロジェクト全体でこれをグローバルに実現する最も簡単な方法です。

于 2010-01-15T07:42:58.960 に答える