44

boost::serialization私たちは一般的に と テンプレートを多用しています。すべてが順調に進んでいるようです。

ただし、Windows ビルドで問題が発生しました。オブジェクト ファイルが大きすぎるという問題が発生するようです。g++ 4.7.0 で MinGW/Msys を使用しています。

c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/as.exe: CMakeFiles/source.dir/sourcecode.cpp.obj: too many sections (33396)
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Assembler messages:
C:\Users\username\AppData\Local\Temp\ccnAocvD.s: Fatal error: can't write CMakeFiles/source.dir/sourcecode.cpp.obj: File too big

マスター グーグルは、このアーカイブ メッセージを明らかにしました

その中で、別の人がほとんど同じ障害にぶつかったことを示しています。/bigobjそれは、必要なことを行うように見えるVisual Studio のオプションのオプションを指していました。ただし、Visual Studio に移行することはできません。

1 つの提案は、アセンブラ オプションに --hash-size を追加することでした。これは役に立ちませんでした。

私が間違っていなければ、問題はオブジェクト ファイルのエントリ数が 2^16 に制限されていることにあります。実際、エラー メッセージによると、これは署名付きの 2^16 エントリであると思いますが、それはピーナッツです。/bigobjVisual Studioのオプションは、これを 2^32 に変更します。メーリング リストの結果は、GCC の同等のオプションを知りませんでした。さらなるグーグルの結果はこれに関連していないようです。

この時点で、この制限を回避するためにコードをリファクタリングする必要があります (うーん)。しかし、テンプレートを大量に使用すると、この問題が何度も発生する可能性があるのではないかと懸念しています (3 つのソース ファイルで既に発生しています)。

私の質問はこうです。/bigobjMicrosoft のオプションに相当する GCC はありますか? まだ見つかっていない 3 番目のオプションはありますか?

4

5 に答える 5

10

エラーは、 にある"%B: too many sections (%d)"関数から発生しています。出力ファイル (COFF 形式) に 32766 を超えるセクションが含まれている場合に生成されます。少なくとも Windows の PE/COFF オブジェクト形式を使用する場合は、このエラーを回避する方法はありません。COFF ファイルは、ファイル ヘッダーの「NumberOfSections」に2 バイトのみを使用します。coff_compute_section_file_positions()bfd/coffcode.h.obj

なぜas(GNU アセンブラーが) セクション数を 65536-minus-1 (セクション 0 は予約済み) ではなく 32768-minus-2 に制限するのか、私にはよくわかりません。ただし、どちらにしても、テンプレートを多用していて、コンパイラが COMDAT セクションを介してテンプレートを実装している場合は、それだけでは不十分な場合があります。

既にお気付きのように、Microsoft のコンパイラに渡すと、最大 2 31/bigobjのセクションを持つ変更された COFF 形式が出力されます。これは、「誰にとっても十分なはずです」。ただし、改ざんされた形式は正式には文書化されておらず、この件に関する非公式のドキュメント (ブログ投稿または what-have-you) は見当たりません。そのため、MSVC のコピーを持っている誰かが. GNU ツールに取り掛かる可能性はあまりありません。/bigobj

私見ですが、Windows ビルドを作成しようとしている場合は、弾丸をかじって MSVC を使用する必要があります。Microsoft 以外に、PE/COFF 形式と格闘して時間を無駄にすることに特に動機付けられている人はいません。

于 2013-10-13T04:49:03.440 に答える
4

Poco ライブラリを MinGW-w64 でコンパイルしたときに同じ問題に直面しました。デバッグ オブジェクトが 1 つの実装ファイルに対して巨大であることが判明しました。

前に述べたように、cpp ファイルを分割することはできますが、それは機能しますが、誰かのソース コードに直面した場合、何かを壊すことなくそれを行うことはできません。

解決策として、コンパイラの最適化を有効にすることができます: -O1 から -O3 まで開始し、各ステップでより小さなオブジェクト ファイルを構築します。問題が解決する可能性があります。私の場合はそうでした。はい、デバッグ ビルドでは望ましくない場合があります。-Ogも試すことができます

于 2014-01-28T19:30:40.580 に答える
4

この問題でいくつかの更新を見つけました。x64 Windows 用の新しい binutils で修正されているようです。https://sourceware.org/ml/binutils/2014-03/msg00114.htmlおよびhttp://sourceforge.net/pを参照してください。 /mingw-w64/bugs/341/ . ただし、この修正は必要な 32 ビット バージョンには適用されないため、テストは行いませんでした。

于 2015-02-06T18:45:39.663 に答える