0

私はすべてのCコードでMS-Visual Studio 2005を使用して構築されたワークスペースを持っています。呼び出されていないがコンパイルされている多くの関数が表示されます(コンパイルを無効にするコンパイル時マクロの下にはありません)。

MS-VS2005 プロジェクトに次の最適化設定を設定して、未使用のコードを削除しました。

最適化レベル - /Ox

プログラム全体の最適化を有効にする - /GL

Favor speed /Ot と Favor Size /Os の両方を試しました

これらすべてのオプションにもかかわらず、リンカが生成したマップ ファイルを見ると、マップ ファイルに存在するシンボル (unsed 関数) の名前が表示されます。

何か不足していますか?未使用のコードを完全に削除したい。

どうすればいいですか?

4

2 に答える 2

2

コンパイラは、C ファイルを 1 つずつコンパイルします。したがって、未使用の関数を含む C ファイルをコンパイルしている間、コンパイラはそれが別のファイルから呼び出されないことを確認できないため、その関数もコンパイルします。ただし、その関数が静的 (ファイル スコープ) として宣言されている場合、コンパイラはそれが使用されていないことを認識し、削除します。

プログラム全体の最適化を行っても、コンパイルはライブラリ用である可能性があるため、まだ実行されていないと思います。

リンカーは、探しているものと同様のことを行います。コードが複数のオブジェクトを含むライブラリに対してリンクしている場合、コードで (直接的または間接的に) 使用される関数を含まないオブジェクトは、最終的な実行可能ファイルに含まれません。

1 つのオプションは、コードを個々のライブラリとオブジェクト ファイルに分割することです。

PS - これは私の推測です。コンパイラ (プログラム全体の最適化) またはリンカーの動作は、基本的に、その特定のコンパイラまたはリンカーの設計上の選択に依存します。

于 2009-10-14T16:00:15.977 に答える
0

私たちのプロジェクトでは、プロジェクトのプロパティ\リンカー\参照の下にフラグが設定されています。参照されていないデータを削除する (/OPT:REF) に設定します。説明によると、これは使用されていない関数呼び出しまたはデータを削除することになっています。私は説明に従っています。これをテストしたり、使用したりしたことはありません。しかし、私はたまたまこの 1 時間以内にそれを見て、試してみることができるかもしれないと考えました。

于 2009-10-14T19:00:04.990 に答える