1

いくつかの巨大な C++ プロジェクトがあり、すべて msvc++ 2010 でコンパイルされています。DLL ファイルを小さくしたいのですが、 誰かインスピレーションを与えてもらえますか?

4

4 に答える 4

1

他の回答に加えてupx、dll またはその他のコンプレッサーを圧縮するために使用できます。

http://upx.sourceforge.net/

于 2013-09-17T08:35:44.347 に答える
1

リリース用にコンパイルし、Link Time Code Generation (LTCG) を使用し、未使用の参照 (OPT:ICF) を削除し、CRT を DLL に入れます。必要でない限り、DLL からエクスポートしないでください。

于 2013-09-17T06:15:36.530 に答える
0

上記の提案に加えて、Project Properties->C/C++->Favor Size Or Speedで、Favor small code (/Os)が選択されていることを確認してください。

于 2013-09-17T08:26:46.650 に答える
0
  1. デバッグではなく、リリースとしてコンパイルします。

  2. 静的ではなく動的に MSVCRT とリンクします。これは、プログラムと共に MSVCRT DLL を配布する必要がある可能性が高いことを意味します。プログラムの構造によっては、CRT のリンクを変更すると、意図しない副作用が生じる可能性があります。

  3. 不要なコードをすべて削除します。プロファイリング ツールまたはコード カバレッジ ツールを使用して、呼び出されていないように見えるコードを特定します。削除できる場合があります。

  4. 各 .c または .cpp ファイルに対応するすべての .obj ファイルを調べます。いずれかの obj ファイルがコード ファイルのサイズに比べて大きすぎる場合、それは何かを減らすことができるヒントである可能性があります。

  5. DLL でのグローバル インスタンスまたはグローバル データの使用を最小限に抑えます。バイナリ サイズは、宣言されたグローバル変数のバイト数だけ膨張します。

  6. 他の EXE や DLL をインポートするために必要な最小限の関数のみをエクスポートします。「dumpbin /exports yourfile.dll」を実行して、エクスポートされた関数のリストを取得します。DLL に依存するコードによって直接呼び出される関数のみをエクスポートします。DLL 外部の誰も直接呼び出さないものをエクスポートする場合は、エクスポートしないでください。内部で何も呼び出されていない場合、リンカーはそれ (およびその依存関係) が使用されないように最適化します。

  7. C++ クラス全体をエクスポートしないでください。DLL が C++ コードの場合は、単純な C ラッパー関数をエクスポートします。

于 2013-09-17T08:44:06.220 に答える