6

私は、最近大幅に成長した大規模な C++ ビルド ライブラリに取り組んでいます。サイズが大きいため、このサイズの増加の原因は明らかではありません。

成長がどこから来たのかを判断するのに役立つツール (msvc または gcc) の提案はありますか?

私が試したことを編集 してください:最終的なdll、objファイルをダンプし、マップファイルを作成してそれをリッピングします。

もう一度編集する ので、pythonスクリプトと一緒にobjdumpを実行すると、私が望むことができたようです。

4

4 に答える 4

7

gcc の場合、objdump . ビジュアル スタジオの場合は、dumpbin .

古い (小さい) ライブラリと新しい (大きい) ライブラリのツールの出力を比較することをお勧めします。

于 2009-06-01T21:31:20.087 に答える
2

keyersoze の答え (objdumpまたはの出力を比較dumpbin) は正しいです。もう 1 つの方法は、リンカーにマップ ファイルを生成するように指示し、DLL の古いバージョンと新しいバージョンのマップ ファイルを比較することです。

  • MSVC:link.exe /MAP
  • GCC と binutils: ld -M(またはgcc -Wl,-M)
于 2009-06-02T17:39:49.050 に答える
1

Linux では、新しいファイルが追加されたかどうかを再帰的な差分で簡単に確認できます。それらは確かにライブラリのサイズを増やします。次に、 Linux でsizeコマンド ライン ツールを使用して、新しい各オブジェクト ファイルのサイズを取得し、それらを合計します。次に、その合計をライブラリの増加と比較し、どれだけ違うかを確認します。

于 2009-06-01T21:58:20.997 に答える
0

こんばんは

以前のバージョンのオブジェクト ファイルが手元にある場合、size コマンドを実行して、どのセグメントが大きくなったかを確認できますか?

いくつかの質問:

  • *nix プラットフォームまたは Windows プラットフォームを使用していますか?
  • どのコンパイラを使用していますか?
  • コンパイラは最近変更されましたか?
  • -g フラグは最近追加されましたか? (当然の質問 1)
  • オブジェクトは以前に削除されましたか? (当然の質問 2)
  • オブジェクトは以前に動的にリンクされていましたか? (当然の質問 3)

編集:コードが SCM の下にある場合、より小さなオブジェクトを提供したソースのバージョンをチェックアウトできますか。次に比較します。

  1. 古いソース ツリーで du -sk を実行し、次に何も構築せずに新しいソース ツリーを実行して、ソース ツリーのサイズを縮小します。
  2. 次のようなことによるファイルの数find ./tree_top ( -name *.h -o -name *.cpp ) | wc -l
  3. a を実行して、増加した数のファイルの場所を特定find ./tree_top ( -name *.h -o -name *.cpp ) -print | sort > treelistし、新しい大きなツリーに対して同じことを行います。単純な sdiff を実行すると、多数の新しいファイルが表示されます。
  4. コードベースのサイズ、末尾のセミコロンの単純なカウントでも、2 つの比較のための優れた基本メカニズムが得られます。
  5. Makefile またはビルド環境。プロジェクトで、さまざまなオプションや設定がビルド自体に忍び込んでいるかどうかを確認します。

HTH

ところで、多くの人があなたの発見に興味を持っていると確信しているので、あなたの調査結果をここに投稿してください。

乾杯、

于 2009-06-01T21:24:47.010 に答える