2

私は現在、MinGWコンパイラを使用するためにライブラリを移植しています(自分で書いたのではなく、移植するだけです)。このライブラリは、あらゆる種類の C++ の「ブラック マジック」 (複数の継承、テンプレートのテンプレートのテンプレート、非常に重いマクロなど) を備えた、非常に重量級のライブラリです。

現在、数週間後、すべてが正常にコンパイルされ、うまく機能しているように見えます (デモと同様に、単体テストも機能します)。

しかし、私を悩ませているのは、MSVC バイナリとは対照的に、MinGW バイナリのサイズが非常に大きいことです。独自の非 MS システム ライブラリを含める必要があるため、MinGW バイナリは一般にわずかに大きいことはわかっていますが、MinGW の場合は 33 MB、MSVC の場合は 13 MB です。そして、それが「リリース」(-O3 および -s フラグ) バージョンです!

これらは、MinGW でコンパイルするフラグです。

-c -O3 -s -MMD -march=native -frtti

リンカーの場合は次のとおりです。

-shared -s -static-libgcc -static-libstdc++ 

rtti によってある程度のサイズが追加されることはわかっていますが、MSVC バイナリにも含まれている必要があります。また、静的な libgcc および libstdc++ ライブラリは、それほど大きくありません... それともできますか?

ここで何が欠けていますか?通常、MinGW と MSVC のサイズの違いはそれほど大きくありません。

4

2 に答える 2

0

私はこの問題を一度経験しましたが、私にとっては rubenvb が示唆したとおりであることが判明しました.C/C++ std ライブラリは MinGW では静的にリンクされていましたが、MSVC では動的にリンクされていました。これを判断するために、コンパイルされた各実行可能ファイル/dll で「dumpbin /imports」を使用しました。MSVC*.dll がインポートとして表示されない場合は、静的にリンクされています。Visual Studio の "Runtime Library" 設定を変更することで、MSVC で std ライブラリを静的にリンクできます。これは、/MT (静的) または /MD (動的) のいずれかである cl.exe へのフラグです。デフォルトでは動的だと思います。

于 2013-08-08T14:42:42.363 に答える
0

まず、誰が気にしますか?パフォーマンスに影響を与えるこの大きなサイズを見たことがありますか?

2 番目: MSVC と静的にリンクしていてよろしいですか? Dependency Walker で確認してください。

3 番目: はい、MinGW GCC でコンパイルされたバイナリは一般的にサイズが大きくなります。これは、MinGW が C ライブラリの一部を提供して、msvcr* がコンプライアンスに関して途方もなく壊れていることを補うためです。ただし、これは私にとって大きな違いとして示されたことはありません。

4 つ目: テンプレートとインラインの処理は、2 つのコンパイラ間で異なる場合があります。

5 番目: -fno-keep-inline-dllexport や -Os を指定して GCC バージョンをコンパイルしようとしましたか?

于 2013-08-07T10:04:16.423 に答える